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[]) { 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 成功得到所需要的值 上面这段代码不知道在哪找得了,好不容易才找到的,改了以后可以适应自己的需求了,感谢网友! 本文出自 51CTO.COM技术博客 |
c++中使用libxml2读取xml文件
最新推荐文章于 2021-08-09 21:24:30 发布