http://www.52php.cn/article/p-tvsilvui-vh.html
在libxml的tutorial中介绍了一种用关键字查找节点的方法,这种方法将使用打xpath系列API。由于我才刚刚接触libxml,所以我对xpath的认识也仅仅是在tutorial提供的功能之内了。废话少说,直接进入整体。
我们在操作xml文件是经常需要根据特定的条件查找一系列的节点,为了实现这样的功能,我们需要一个xmlXPathContextPtr和一个expression。我们调用xmlXPathEvalExpression函数来得到一个xmlXPathObjectPtr指针,这个指针包含了一个xmlNodeSetPtr,其中有一个变量nodeTab是我们所需要的节点数组。
- xmlXPathObjectPtrret=NULL;
- xmlXPathContextPtrcon=NULL;
-
- con=xmlXPathNewContext(doc);
- ret=xmlXPathEvalExpression((xmlChar*)expr,con);
- xmlXPathFreeContext(con);
这样我们就得到了查询的结果了。expr是查询的条件,tutorial给的例子里,这个条件是“//keyword”,表示找出所有名称为keyword的节点。至于其他的条件,我现在还不知道。
得到了查询的结果,我们就要对结果进行处理。
if(NULL==ret){
- fprintf(stderr,"evalfuncerrorn");
- exit(1);
- }
- if(xmlXPathNodeSetIsEmpty(ret->nodesetval)){
- "nodesetemptyn");
- xmlXPathFreeObject(ret);
- exit(1);
- }
- xmlNodeSetPtrnodeset=ret->nodesetval;
- inti;
- for(i=0;i<nodeset->nodeNr;i++){
-
- xmlXPathFreeObject(ret);
下面是一个程序的实例。用于提取出网页中的链接:
web.html
<html>
- <head>
- <title>web</title>
- </head>
- <body>
- <ahref="www.baidu.com">baidu</a>
- <ahref="www.google.com">Google</a>
- </body>
- </html>
link.c
#include<stdio.h>
- #include<string.h>
- #include<stdlib.h>
- #include<libxml/parser.h>
- #include<libxml/xpath.h>
-
- staticxmlDocPtr
- getDocPtr(char*docname){
- xmlDocPtrdoc=NULL;
- xmlKeepBlanksDefault(0);
- doc=xmlParseFile(docname);
- if(NULL==doc){
- "documentcannotbeparsed!n");
- returndoc;
- staticxmlXPathObjectPtr
- getXPathObjectPtr(xmlDocPtrdoc,xmlChar*xpath_exp){
- xmlXPathObjectPtrresult;
- xmlXPathContextPtrcontext;
- context=xmlXPathNewContext(doc);
- result=xmlXPathEvalExpression((constxmlChar*)xpath_exp,context);
- xmlXPathFreeContext(context);
- if(NULL==result){
- "evalexpressionerror!n");
- returnNULL;
- if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
- fprintf(stderr,0); background-color:inherit">"emptynodeset!n");
- xmlXPathFreeObject(result);
- returnresult;
- intmain(){
- char*docname="web.html";
- xmlDocPtrdoc=NULL;
- xmlXPathObjectPtrxpath_obj=NULL;
- xmlNodeSetPtrnodeset=NULL;
- xmlChar*xpath_exp=(xmlChar*)"//a";
- xmlChar*uri;
- doc=getDocPtr(docname);
- xpath_obj=getXPathObjectPtr(doc,xpath_exp);
- if(NULL!=xpath_obj){
- nodeset=xpath_obj->nodesetval;
- inti=0;
- for(i=0;i<nodeset->nodeNr;i++){
- uri=xmlGetProp(nodeset->nodeTab[i],(constxmlChar*)"href");
- printf("linkaddress:%sn",uri);
- xmlFree(uri);
- xmlXPathFreeObject(xpath_obj);
- xmlFreeDoc(doc);
- xmlCleanupParser();
- return1;
- }
输出结果为:
linkaddress:www.baidu.com
- linkaddress:www.google.com
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|