windows下使用libxml2

XML是一种常用的信息组织方式,表达能力很强,效率相对来说较低。一般在Linux环境下默认已安装,下面介绍如何在Windows环境下使用。

下载安装

到官网指定的FTP站点下载相关文件,这里采用直接下载二进制文件的方式,需要下载以下几项:

解压后将include和lib目录中的文件分别拷到系统编译的同名目录下,另外还需要拷贝bin目录下的dll文件到运行环境,所有需要的文件列出如下:

编译选项

使用libxml2库,需要的头文件有:

对应的库文件有:

在Linux环境下,链接库一般用-l参数指定,而在Windows环境下,一般用#pragma指令。

示例程序

假设有测试XML文件1.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<root>
    <node1 attr1="111" attr2="222">
        <val1>zxv</val1>
        <val2 aaa="asd" bbb="bbb">
            <zzz xxx="xxx" yyy="yyy">ojbk</zzz>
            <uuu xxx="uuu" yyy="uuu">hehe</uuu>
        </val2>
    </node1>
    <node2 attr1="123" attr2="123" attr3="123"></node2>
    <node ooo="ooo" ppp="ppp">
        <zjl nn="nn" mm="mmm" acm="acm" />
    </node>
    <node wtf="123">
        <cfy>123456</cfy>
    </node>
</root>

以下代码对整个XML文件内容进行遍历,并打印出所有属性和内容。

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

#pragma comment(lib, "libxml2.lib")
#pragma comment(lib, "iconv.lib")

int ParseXml(const char *xmlfile, xmlDocPtr *doc, xmlNodePtr *root)
{
    xmlKeepBlanksDefault(0);

    if ((*doc = xmlParseFile(xmlfile)) == NULL) {
        fprintf(stderr, "parse xmlfile [%s] failed\n", xmlfile);
        return 1;
    }

    if ((*root = xmlDocGetRootElement(*doc)) == NULL) {
        fprintf(stderr, "empty xmlfile\n");
        return 1;
    }
    return 0;
}

void dfs(xmlNodePtr node, char *path, int pos)
{
    xmlNodePtr p;
    xmlAttrPtr q;
    for (p = node; p; p = p->next) {
        if (XML_ELEMENT_NODE == p->type) {
            int len = sprintf(path + pos, "/%s", p->name);
            for (q = p->properties; q; q = q->next)
                fprintf(stdout, "%s: %s = %s\n", path, q->name, xmlGetProp(p, q->name));
            dfs(p->children, path, pos + len);
        } else if (XML_TEXT_NODE == p->type) {
            fprintf(stdout, "%s: %s\n", path, xmlNodeGetContent(p));
            dfs(p->children, path, pos);
        }
    }
}

int main()
{
    xmlDocPtr doc = NULL;
    xmlNodePtr root = NULL;
    char path[512] = {0};

    ParseXml("1.xml", &doc, &root);
    dfs(root, path, 0);
    xmlFreeDoc(doc);

    return 0;
}

运行结果如下:

/root/node1: attr1 = 111
/root/node1: attr2 = 222
/root/node1/val1: zxv
/root/node1/val2: aaa = asd
/root/node1/val2: bbb = bbb
/root/node1/val2/zzz: xxx = xxx
/root/node1/val2/zzz: yyy = yyy
/root/node1/val2/zzz: ojbk
/root/node1/val2/uuu: xxx = uuu
/root/node1/val2/uuu: yyy = uuu
/root/node1/val2/uuu: hehe
/root/node2: attr1 = 123
/root/node2: attr2 = 123
/root/node2: attr3 = 123
/root/node: ooo = ooo
/root/node: ppp = ppp
/root/node/zjl: nn = nn
/root/node/zjl: mm = mmm
/root/node/zjl: acm = acm
/root/node: wtf = 123
/root/node/cfy: 123456
Table of Contents