您的位置:首页 > 运维架构 > Linux

linux下,纯c++使用libxml2读取xml文件

2012-04-24 10:22 417 查看
linux下,纯c++使用libxml2读取xml文件

下载libxml2

ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz

常规方法进行安装

#tar xvzf libxml2-xxxx.tar.gz

#./configure

#make

#make install

把libxml2下的libxml拷贝一份到libxml2所在的目录

#cp /usr/include/libxml2/libxml /usr/include/libxml

这一步不是必需的,但是在笔者的机器上不这样做就不行,编译的时候想

g++ a.cpp -llibxml2 -o a 这样指定一下发现parser.h但是发现parser.h里面

定义的库全是include<libxml/parser.h>.而parser.h的实际位置是在<libxml2\

libxml/parser.h>,没办法了,但是这样拷贝一下就好了

现在要说一下xml文件了,笔者要读取了xml有两种格式,一种

<root>

<node1>aaaaa</node1>

<node2>bbbbb</node2>

</root>

一种

<root>

<node1 a="10">aaaaa</node1>

<node2 b="20">bbbbb</node2>

</root>

整理一下,本文要读取的d.xml为

<?xml version="1.0" encoding="UTF-8" ?>

<root>

<node1 a="10">aaaaa</node1>

<node2 b="20">bbbbb</node2>

</root>

目的为取出其它的 b的值和node2的属性值

OK,开工

#include <iostream>

#include <libxml/parser.h>

int main(int argc, char *argv[])

{

xmlDocPtrdoc; //定义解析文档指针

xmlNodePtr curNode; //定义结点指针(你需要它为了在各个结点间移动)

xmlChar*szKey; //临时字符串变量

char szDocName[] = "d.xml";

using std::string;

using std::cout;

using std::endl;

doc =xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析文件

//检查解析文档是否成功,如果不成功,libxml将指一个注册的错误并停止。

//一个常见错误是不适当的编码。XML标准文档除了用UTF-8或UTF-16外还可用其它编码保存。

//如果文档是这样,libxml将自动地为你转换到UTF-8。更多关于XML编码信息包含在XML标准中.

if (NULL == doc)

{

//文档打开错误

return -1;

}

curNode = xmlDocGetRootElement(doc); //确定文档根元素

/*检查确认当前文档中包含内容*/

if (NULL == curNode)

{

//空得xml文件

xmlFreeDoc(doc);

return -2;

}

/*在这个例子中,我们需要确认文档是正确的类型。“root”是在这个示例中使用文档的根类型。*/

if (xmlStrcmp(curNode->name, BAD_CAST "root"))

{

//分析根元素失败

xmlFreeDoc(doc);

return -3;

}

curNode = curNode->xmlChildrenNode;

xmlNodePtr propNodePtr = curNode;

while(curNode != NULL)

{

//取出节点中的内容

if ((!xmlStrcmp(curNode->name, (constxmlChar *)"node2")))

{

szKey =xmlNodeGetContent(curNode);

cout <<szKey << endl; //得到node2的值并输出

xmlFree(szKey);

}

//查找带有属性attribute的节点

if (xmlHasProp(curNode,BAD_CAST"b"))

{

propNodePtr =curNode;

}

curNode = curNode->next;

}

//查找属性

xmlAttrPtr attrPtr = propNodePtr->properties;

while (attrPtr != NULL)

{

if (!xmlStrcmp(attrPtr->name, BAD_CAST"b"))

{

xmlChar* szAttr =xmlGetProp(propNodePtr,BAD_CAST "b");

cout << szAttr<< endl; //找到b的属性并输出

xmlFree(szAttr);

}

attrPtr = attrPtr->next;

}

xmlFreeDoc(doc);

return 0;

}

OK编译一下:

g++ a.cpp -lxml2 -o a

$./a

bbbbb

20

成功得到所需要的值

上面这段代码不知道在哪找得了,好不容易才找到的,改了以后可以适应自己的需求了,感谢网友!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: