测试使用版本为libxml2-2.7.3.tar.gz ,网上即可下载到。
一. 安装
1. 解压
2. ./configure
3. make
4. make install
安装完成后, 会在当前路径下, 有个目录 .libs , 里面有libxml2.a libxml2.so 等。
头文件和lib 默认安装路径为 /usr/include/libxml2/libxml/ /usr/lib64/
或 /usr/local/include/libxml2/libxml /usr/local/lib64
二. 使用
1. 如何正确安装,写demo时直接包含头文件 #include<libxml/parser.h> 等即可
自己使用时,由于机器权限问题, make 成功,但是make install 失败, 未能正确安装
但只要make 成功,.a .so 都已生成, 所以可以直接使用, 即方法2
2. make 成功后, 在libxml2-2.7.3/include/libxml 下包含了所有的头文件, libxml2-2.7.3/.libs 下包含了所有的.a 和 .so 库文件
a. test.xml 示例, 目的取出W 的值和 它的属性
b. demo.cpp
#include <libxml/parser.h>
#include <iostream>
using namespace std;
int main()
{
xmlDocPtr doc; //定义解析文档的指针
xmlNodePtr curNode; //定义节点指针
xmlChar *szKey; //临时字符串变量
char szDocName[] = "test.xml"; //指定要解析的xml文档
doc = xmlReadFile(szDocName,"UTF-8",XML_PARSE_RECOVER); //解析读取xml文档
if (NULL == doc)
{
cout << "open test.xml fail" <<endl;
return -1;
}
curNode = xmlDocGetRootElement(doc); //获取xml文档的根节点(元素)
if (NULL == curNode)
{
xmlFreeDoc(doc);
cout << "test.xml is empty" <<endl;
return -2;
}
if (xmlStrcmp(curNode->name, BAD_CAST "root")) //检查根节点是否正确
{
xmlFreeDoc(doc);
cout << "root is wrong" <<endl;
return -3;
}
curNode = curNode->xmlChildrenNode; //获取根节点的子节点
xmlNodePtr propNodePtr = curNode;
while(curNode != NULL)
{
if ((!xmlStrcmp(curNode->name, (const xmlChar *)"W")))
{
szKey = xmlNodeGetContent(curNode); // 获取该节点的内容
cout << szKey << endl;
xmlFree(szKey);
}
if (xmlHasProp(curNode,BAD_CAST "b")) //查找带有属性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;
xmlFree(szAttr);
}
attrPtr = attrPtr->next;
}
xmlFreeDoc(doc);
return 0;
}
c. 编译
g++ -o demo demo.cpp -I/usr/include/libxml2/ -L/usr/lib64/ -lxml2
或 g++ -o demo demo.cpp -I./include/ -L./.libs -lxml2
d. 输出
width
20