libxml的使用

欢迎访问个人博客,阅读此文http://www.yandong.org/archives/343

安装:

xml2-config –cflags // 取得预处理和编译标志
  xml2-config –libs // 取得链接标志

几个网址:

http://sblig.iteye.com/blog/814323

百度文库资料


使用:
解析文件:

void parseDoc ( char *docName )
  {
    xmlDocPtr doc; //文件指针
    xmlNodePtr cur; //节点指针
    doc = xmlParseFile(docName);
    cur = xmlDocGetRootElement(doc);
    if (xmlStrcmp(cur->name, ( const xmlChar*) "root" ) )
    {
      xmlFreeDoc(doc);
      return ;
    }
    cur = cur->xmlChildrenNode;
    parseNode(doc, cur); //处理节点
    //xmlSaveFormatFileEnc("tconfig.xml", doc, "UTF-8", 1 );//保存修改
    xmlFreeDoc(doc); //释放内存
    xmlCleanupParser();
    xmlMemoryDump();
    return ;
  }

创建xml文件:

outputDoc = xmlNewDoc(BAD_CAST "1.0" );
outputCur = xmlNewNode( NULL, BAD_CAST "root" );
xmlDocSetRootElement(outputDoc, outputCur);
outputCur = xmlDocGetRootElement(outputDoc);
outputFileName =( const char *) generateFileName(i).c_str();
xmlSaveFormatFileEnc(outputFileName, outputDoc, "UTF-8" , 1 );
xmlFreeDoc(outputDoc);

处理节点:
获取节点属性:
<xen_host id=”1″>
</xen_host>

xmlChar * attr;
attr = xmlGetProp(cur, ( const xmlChar*) "id" );
cout<<cur->name<< " id= " <<attr<< " " <<endl;
xmlFree(attr);

寻找所有叫xen_host的节点:
<root>
<xen_host id=”1″>
</xen_host>
<xen_switch id=”1″>
</xen_switch>
<xen_host id=”1″>
</xen_host>
//此处空白叫 text,在cur = cur->next中也会出现
</root>

while (cur != NULL)
  {
    if (!xmlStrcmp(cur->name, ( const xmlChar*) "xen_host" ) )
    {
      //处理
    }
    cur = cur->next;
}

获取中间text内容:
<linknode >
获取这个
</linknode>

xmlChar * attr;
attr = xmlNodeListGetString(doc, linkNode->xmlChildrenNode, 1 );
xmlFree(attr);

拼接xmlChar和int或者char:
方式有很多,也可以使用stringstream,但是发现总是会有错误,合并出来的字符串出现乱码,估计是指针操作没有处理好。

char buf[1024];
string genXenSubnetString ( xmlChar * attr )
  {
    sprintf (buf, "/root/xen_subnet/link/parent::*" , attr);
    return string(buf);
}

删除节点:

xmlNodePtr
xmlDeleteNode (xmlNodePtr cur )
{
   xmlNodePtr tempNode;
   tempNode = cur->next;
   cout<< "del" <<endl;
   xmlUnlinkNode(cur);
   xmlFreeNode(cur);
   cur = tempNode;
   return cur;
}

复制节点:

temp1 = xmlCopyNode( cur, 1 );
xmlAddChild(outputCur, temp1);

xpath的使用:
要想自由的处理xml的节点,要么自己建立数据结构把所有的xml节点存起来,要么使用xpath,对xpath的使用难点在于匹配表达式的书写。
//该函数是接受xpath表达式,返回找到的xml节点数组对象

xmlXPathObjectPtr getNodeSet(xmlDocPtr doc, const xmlChar *xpath)
{
   xmlXPathContextPtr context;
   xmlXPathObjectPtr result;
   context = xmlXPathNewContext(doc);
   if (context == NULL)
   {
     printf ( "context is NULL\n" );
     return NULL;
   }
   result = xmlXPathEvalExpression(xpath, context);
   xmlXPathFreeContext(context);
   if (result == NULL)
   {
     printf ( "xmlXPathExpression return NULL\n" );
     return NULL;
   }
   if (xmlXPathNodeSetIsEmpty(result->nodesetval))
   {
     xmlXPathFreeObject(result);
     printf ( "nodeset is empty\n" );
     return NULL;
   }
   return result;
   }
   xmlChar *xpath;
   xmlXPathObjectPtr xpathResult;
   xmlNodeSetPtr nodeSet;
   int nodeSetSize;
   xpath = (xmlChar *) "/root/*[@id='54']" ;
   xpathResult = getNodeSet(doc, xpath); //处理xpath
   if (NULL != xpathResult)
   {
     nodeSet = xpathResult->nodesetval; //转换类型
     nodeSetSize = (nodeSet)?(nodeSet->nodeNr):0; //判断个数
     for ( int i=0; i<nodeSetSize; i++)
     {
        //处理
        cout<<nodeSet->nodeTab[i]->name<<endl;
     }
   }

关于xpath怎么写,请看这篇文章
几个问题:
1.
因为总是要在xmlChar*和char*之间进行类型转换,所以定义了一个宏BAD_CAST,其定义如下:xmlstring.h
#define BAD_CAST (xmlChar *)
(continue….)

转载于:https://my.oschina.net/toyandong/blog/64998

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值