下载libxml2:
官方网站,下载适合自己版本的源码包。
http://rpmfind.net/linux/rpm2html/search.php?query=libxml2-devel
我下载的是:
libxml2-devel-2.9.1-5.1.i586.rpm
用命令解压:
rpm2cpio libxml2-devel-2.9.1-5.1.i586.rpm |cpio –div
这条命令太神了,之后没有用make该有的就都有了。
liuguili@ubuntu:~/libxml$ rpm2cpiolibxml2-devel-2.9.1-5.1.i586.rpm | cpio -div
liuguili@ubuntu:~/libxml$
liuguili@ubuntu:~/libxml$ cd usr
liuguili@ubuntu:~/libxml/usr$ ls
bin include lib share
liuguili@ubuntu:~/libxml/usr$
后来胡乱在网上找了一段源码,想编译下试试,结果报头文件找不到。
In file included from test1.c:2:0:
libxml/parser.h:15:31: fatal error:libxml/xmlversion.h: No such file or directory
compilation terminated.
我以为是安装有问题,又装了一遍:
sudo apt-get install libxml2-dev libxslt1-dev |
还是不成,毛关系没有。
省略一万字,反正我研究了两个小时~~
后来发现加两个编译选项就好了~~
liuguili@ubuntu:~/xmltest/usr/include$ g++test1.c -I/home/liuguili/xmltest/usr/include/libxml2/ -L/home/liuguili/xmltest/usr/lib -lxml2 -o testxml
liuguili@ubuntu:~/xmltest/usr/include$ ./testxml
bbbbb
20
谢谢热情的大神~~
附上在网上找的一段源码
#include <iostream>
#include <libxml/parser.h>
int main(int argc, char *argv[])
{
xmlDocPtrdoc; //定义解析文档指针
xmlNodePtrcurNode; //定义结点指针(你需要它为了在各个结点间移动)
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;
}
本文要读取的d.xml为
<?xml version="1.0"encoding="UTF-8" ?>
<root>
<node1 a="10">aaaaa</node1>
<node2 b="20">bbbbb</node2>
</root>