libxml库笔记

来源:互联网 发布:治疗网络强迫症的方法 编辑:程序博客网 时间:2024/06/05 03:28

xml2-config   看一些命令的参数参数,加深对这个xml2的了解

或者加入到makefile中,例如:

CFLAGS=`xml2-config--cflags`

LIBS=`xml2-config--libs`

gcc-I/usr/include/libxml2 -L/usr/local/lib -o parsefilet parsefile.c -lxml2

 

 

 

数据结构

节点类型xmlNode、指针xmlNodePtr

节点应该是xml中最重要的元素了,xmlNode代表了xml文件中的一个节点,实现为一个

struct,内容非常丰富:tree.h

typedef struct _xmlNode xmlNode;

typedef xmlNode *xmlNodePtr;

struct _xmlNode {

   void              *_private;/*application data */

   xmlElementType    type;      /* type number, must be second ! */

   const xmlChar      *name;             /* the name of the node, or the entity */

   struct _xmlNode *children; /* parent->childs link */

   struct _xmlNode *last;      /*last child link */

   struct _xmlNode *parent;/* child->parent link */

   struct _xmlNode *next;      /*next sibling link */

   struct _xmlNode *prev;      /*previous sibling link */

    struct _xmlDoc *doc;/* the containing document */

   /* End of common part */

   xmlNs          *ns;             /* pointer to the associated namespace */

   xmlChar         *content;      /* the content */

   struct _xmlAttr *properties;   /*properties list */

   xmlNs           *nsDef;          /* namespace definitions on this node */

   void              *psvi;   /* for type/PSVI informations */

   unsigned short      line;      /* line number */

   unsigned short      extra; /*extra data for XPath/XSLT */

};

能看到,节点之间是以链表和树两种方式同时组织起来的,next和prev指针能组成链表,

而parent和children能组织为树。同时更有以下重要元素:

l                  节点中的文字内容:content;

l                  节点所属文件:doc;

l                  节点名字:name;

l                  节点的namespace:ns;

l                  节点属性列表:properties;

Xml文件的操作其根本原理就是在节点之间移动、查询节点的各项信息,并进行增加、删除、

修改的操作。

xmlDocSetRootElement函数能将一个节点设置为某个文件的根节点,这是将文件和节点连接

起来的重要手段,当有了根结点以后,所有子节点就能依次连接上根节点,从而组织成为一

个xml树

 

xmlNodePt curNode;

xmlNodeGetContent(curNode)这个函数把整个节点的内容全都读出来了,如果是curNode->content,它就读的当前节点的内容。

 

查找一个节点的子节点

childNode=curNode->children;

  while(childNode)

   {

      if(xmlStrcmp(childNode->name, (const xmlChar *)"son"))

       {   

           printf("djld");break;

       }

      childNode=childNode->next;

   }

 

2修改了内容之后要保存xml文件

 

使用XPATH查找xml文件

简而言之,XPATH之于xml,好比SQL之于关系数据库。要在一个复杂的xml文件中查找所需的信息,XPATH简直是必不可少的工具。XPATH语法简单易学,并且有一个非常好的官方教程,见

http://www.zvon.org/xxl/XPathTutorial/Output_chi/introduction.html

。这个站点的XML各种教程齐全,并且有包括中文在内的各国语言版本,真是让我喜欢到非常!

使用XPATH之前,必须首先熟悉几个数据类型和函数,他们是使用XPATH的前提。在libxml2中使用Xpath是非常简单的,其流程如下:

l        定义一个XPATH上下文指针xmlXPathContextPtr context,并且使用xmlXPathNewContext函数来初始化这个指针;

l        定义一个XPATH对象指针xmlXPathObjectPtr result,并且使用xmlXPathEvalExpression函数来计算Xpath表达式,得到查询结果,将结果存入对象指针中;

l        使用result->nodesetval得到节点集合指针,其中包含了所有符合Xpath查询结果的节点;

l        使用xmlXPathFreeContext释放上下文指针;

l        使用xmlXPathFreeObject释放Xpath对象指针;

具体的使用方法能看XpathForXmlFile.cpp的这一段代码,其功能是查找符合某个Xpath语句的对象指针:

xmlXPathObjectPtr getNodeSet(xmlDocPtr doc,const xmlChar *szXpath)

{

   xmlXPathContextPtr context;   //XPATH上下文指针

   xmlXPathObjectPtr result;      //XPATH对象指针,用来存储查询结果

   context = xmlXPathNewContext(doc);    //创建一个XPath上下文指针

   if (context == NULL)

   {  

      printf("context is NULL\n;

      return NULL;

    }

   result = xmlXPathEvalExpression(szXpath, context); //查询XPath表达式,得到一个查询结果

   xmlXPathFreeContext(context);            //释放上下文指针

   if (result == NULL)

    {

      printf("xmlXPathEvalExpression return NULL"n");

      return NULL;

    }

   if (xmlXPathNodeSetIsEmpty(result->nodesetval))   //检查查询结果是否为空

    {

      xmlXPathFreeObject(result);

      printf("nodeset is empty"n");

      return NULL;

    }

   return result;   

}

一个完整的使用Xpath的例子在代码XpathForXmlFile.cpp中,他查找一个xml文件中符合"/root/node2[@attribute=’yes’]"语句的结果,并且将找到的节点的属性和内容打印出来。

0 0
原创粉丝点击