使用xmltextreader对象读取xml文档示例



#include <stdio.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlreader.h>

int main() {
    // 初始化库
    LIBXML_TEST_VERSION

    // 打开文件
    xmlTextReaderPtr reader = xmlReaderForFile("example.xml", NULL, 0);
    if (reader == NULL) {
        fprintf(stderr, "Error: unable to parse file \"example.xml\"\n");
        return -1;
    }

    // 读取并处理每个节点
    int ret = 1;
    while (ret == 1) {
        ret = xmlTextReaderRead(reader);
        if (ret == 1) {
            // 获取节点类型
            xmlNodeType nodeType = xmlTextReaderNodeType(reader);
            switch (nodeType) {
                case XML_READER_TYPE_ELEMENT:
                    // 处理元素节点
                    const xmlChar *name = xmlTextReaderConstName(reader);
                    printf("Element: %s\n", name);
                    break;
                case XML_READER_TYPE_TEXT:
                    // 处理文本节点
                    const xmlChar *content = xmlTextReaderConstValue(reader);
                    printf("Text: %s\n", content);
                    break;
                // 可以根据需要添加更多节点类型的处理
                default:
                    break;
            }
        } else if (ret == 0) {
            // 文件结束
            printf("End of file.\n");
        } else {
            // 错误处理
            const char *error_msg = xmlTextReaderConstErrorMsg(reader);
            fprintf(stderr, "Error: %s\n", error_msg);
            xmlFreeTextReader(reader);
            return -1;
        }
    }

    // 清理
    xmlFreeTextReader(reader);
    xmlCleanupParser();

    return 0;
}

这段代码展示了如何使用`xmlTextReader`对象来读取和处理XML文档。它首先尝试打开名为"example.xml"的文件,并创建一个`xmlTextReaderPtr`类型的读取器。然后,它进入一个循环,使用`xmlTextReaderRead`函数逐个读取节点,并根据节点类型(如元素或文本)进行相应的处理。如果读取过程中遇到错误,它会打印错误信息并退出。最后,它清理了读取器和XML库。

请注意,为了编译这段代码,您需要链接libxml2库。在GCC中,您可以使用类似`-lxml2`的链接器选项。此外,确保您的系统已安装libxml2库和相应的头文件。