linux下,纯c++使用libxml2读取xml文件
下载libxml2
[url]ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz[/url]
常规方法进行安装
#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[])
{
xmlDocPtr doc; //定义解析文档指针
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, (const xmlChar *)"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
成功得到所需要的值
上面这段代码不知道在哪找得了,好不容易才找到的,改了以后可以适应自己的需求了,感谢网友!
下载libxml2
[url]ftp://ftp.xmlsoft.org/libxml2/libxml2-sources-2.7.1.tar.gz[/url]
常规方法进行安装
#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[])
{
xmlDocPtr doc; //定义解析文档指针
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, (const xmlChar *)"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
成功得到所需要的值
上面这段代码不知道在哪找得了,好不容易才找到的,改了以后可以适应自己的需求了,感谢网友!