windows下使用libxml2
XML是一种常用的信息组织方式,表达能力很强,效率相对来说较低。一般在Linux环境下默认已安装,下面介绍如何在Windows环境下使用。
下载安装
到官网指定的FTP站点下载相关文件,这里采用直接下载二进制文件的方式,需要下载以下几项:
- libxml2
- iconv
解压后将include和lib目录中的文件分别拷到系统编译的同名目录下,另外还需要拷贝bin目录下的dll文件到运行环境,所有需要的文件列出如下:
- libxml2
- include/libxml整个目录
- lib/libxml2.lib
- bin/libxml2.dll
- iconv
- include/iconv.h
- lib/iconv.lib
- bin/iconv.dll
编译选项
使用libxml2库,需要的头文件有:
- <libxml/parser.h>
- <libxml/tree.h>
对应的库文件有:
- libxml2.lib
- iconv.lib
在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