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’]"语句的结果,并且将找到的节点的属性和内容打印出来。