微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

libxml的使用4--xpath搜索节点树

http://www.jb51.cc/article/p-tvsilvui-vh.html

在libxml的tutorial中介绍了一种用关键字查找节点的方法,这种方法将使用打xpath系列API。由于我才刚刚接触libxml,所以我对xpath的认识也仅仅是在tutorial提供的功能之内了。废话少说,直接进入整体。

我们在操作xml文件是经常需要根据特定的条件查找一系列的节点,为了实现这样的功能,我们需要一个xmlXPathContextPtr和一个expression。我们调用xmlXPathEvalExpression函数来得到一个xmlXPathObjectPtr指针,这个指针包含了一个xmlNodeSetPtr,其中有一个变量nodeTab是我们所需要的节点数组。

  1. xmlXPathObjectPtrret=NULL;
  2. xmlXPathContextPtrcon=NULL;
  3. con=xmlXPathNewContext(doc);
  4. ret=xmlXPathEvalExpression((xmlChar*)expr,con);
  5. xmlXPathFreeContext(con);

这样我们就得到了查询的结果了。expr是查询的条件,tutorial给的例子里,这个条件是“//keyword”,表示找出所有名称为keyword的节点。至于其他的条件,我现在还不知道。

得到了查询的结果,我们就要对结果进行处理。

?
    if(NULL==ret){
  1. fprintf(stderr,"evalfuncerror\n");
  2. exit(1);
  3. }
  4. if(xmlXPathNodeSetIsEmpty(ret->nodesetval)){
  5. "nodesetempty\n");
  6. xmlXPathFreeObject(ret);
  7. exit(1);
  8. }
  9. xmlNodeSetPtrnodeset=ret->nodesetval;
  10. inti;
  11. for(i=0;i<nodeset->nodeNr;i++){
  12. //handlethenode
  13. xmlXPathFreeObject(ret);

下面是一个程序的实例。用于提取出网页中的链接

web.html

[html] ?
    <html>
  1. <head>
  2. <title>web</title>
  3. </head>
  4. <body>
  5. <ahref="www.baidu.com">baidu</a>
  6. <ahref="www.google.com">Google</a>
  7. </body>
  8. </html>

link.c

?
    #include<stdio.h>
  1. #include<string.h>
  2. #include<stdlib.h>
  3. #include<libxml/parser.h>
  4. #include<libxml/xpath.h>
  5. staticxmlDocPtr
  6. getDocPtr(char*docname){
  7. xmlDocPtrdoc=NULL;
  8. xmlKeepBlanksDefault(0);
  9. doc=xmlParseFile(docname);
  10. if(NULL==doc){
  11. "documentcannotbeparsed!\n");
  12. returndoc;
  13. staticxmlXPathObjectPtr
  14. getXPathObjectPtr(xmlDocPtrdoc,xmlChar*xpath_exp){
  15. xmlXPathObjectPtrresult;
  16. xmlXPathContextPtrcontext;
  17. context=xmlXPathNewContext(doc);
  18. result=xmlXPathEvalExpression((constxmlChar*)xpath_exp,context);
  19. xmlXPathFreeContext(context);
  20. if(NULL==result){
  21. "evalexpressionerror!\n");
  22. returnNULL;
  23. if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
  24. fprintf(stderr,0); background-color:inherit">"emptynodeset!\n");
  25. xmlXPathFreeObject(result);
  26. returnresult;
  27. intmain(){
  28. char*docname="web.html";
  29. xmlDocPtrdoc=NULL;
  30. xmlXPathObjectPtrxpath_obj=NULL;
  31. xmlNodeSetPtrnodeset=NULL;
  32. xmlChar*xpath_exp=(xmlChar*)"//a";
  33. xmlChar*uri;
  34. doc=getDocPtr(docname);
  35. xpath_obj=getXPathObjectPtr(doc,xpath_exp);
  36. if(NULL!=xpath_obj){
  37. nodeset=xpath_obj->nodesetval;
  38. inti=0;
  39. for(i=0;i<nodeset->nodeNr;i++){
  40. uri=xmlGetProp(nodeset->nodeTab[i],(constxmlChar*)"href");
  41. printf("linkaddress:%s\n",uri);
  42. xmlFree(uri);
  43. xmlXPathFreeObject(xpath_obj);
  44. xmlFreeDoc(doc);
  45. xmlCleanupParser();
  46. return1;
  47. }

输出结果为:

?
    linkaddress:www.baidu.com
  1. linkaddress:www.google.com

原文地址:https://www.jb51.cc/xml/299011.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。