- 论坛徽章:
- 0
|
(本篇内容接上一次的文章)在上次介绍完Libxml2在Linux下的安装和使用它来生成xml后,决定把如何使用Libxml2解析xml也一并拿出来和大家分享。 今天介绍的方法为使用Dom树解析,将给出两个 实例,说明如何使用Libxml2遍历xml文档和使Xpath获取特定结点的内容值:(程序使用的xml文档为
content of node 1
node has attributes
other way to create content )
遍历程序代码
#include
#include
#include
using namespace std;
int main(int argc,char** argv)
{
xmlDocPtr doc=NULL;
xmlNodePtr cur=NULL;
char* name=NULL;
char* value=NULL;
xmlKeepBlanksDefault (0);
if(argc
//walk the tree
cur=cur->xmlChildrenNode;//get sub node
while(cur !=NULL)
{
name=(char*)(cur->name);
value=(char*)xmlNodeGetContent(cur);
coutnext;
}
xmlFreeDoc(doc);//释放xml解析库所用资源
xmlCleanupParser();
return 0;
}
说明:
1. 当使用dom树来解析xml文档时,由于默认的方式是把节点间的空白当作第一个子
节 点,所以为了能和常说的第一个子节点相符,需调用xmlKeepBlanksDefault (0)函数
来忽略这种空白。
2. 对于使用xmlChar* xmlNodeGetContent(xmlNodePtr cur)函数获取节点内容后,必须调
用xmlFree()来对所分配的内存进行释放。
使用Xpath获取特定结点的内容(使用的xml文档见上面):
#include
#include
using namespace std;
#include
#include
#include
#include
int main(int argc,char** argv)
{
xmlDocPtr doc;
xmlXPathContextPtr xpathCtx;
xmlXPathObjectPtr xpathObj;
xmlNodeSetPtr nodeset;
string xpathExpr;
char* val=NULL;
int size,i;
if(argc
/* Create xpath evaluation context */
xpathCtx = xmlXPathNewContext(doc);
if(xpathCtx == NULL)
{
cout
xpathExpr="/root/node3";
/* Evaluate xpath expression */
xpathObj = xmlXPathEvalExpression((const xmlChar*)(xpathExpr.c_str()), xpathCtx);
if(xpathObj == NULL)
{
coutnodesetval;
if(xmlXPathNodeSetIsEmpty(nodeset))
{
coutnodeNr : 0;
for(i = 0; i nodeTab->xmlChildrenNode, 1);
cout
所有程序编译运行都同前一次所说,这里不再一一例举。
另外由于这个排版比较麻烦,所以程序美观程度大打折扣,大家就将就一下吧,呵呵。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/43025/showart_337727.html |
|