解析一个xml文档,从中取出想要的信息,例如节点中包含的文字,或者某个节点的属性,其流程如下:
l 用xmlReadFile函数读出一个文档指针doc;
l 用xmlDocGetRootElement函数得到根节点curNode;
l curNode->xmlChildrenNode就是根节点的子节点集合;
l 轮询子节点集合,找到所需的节点,用xmlNodeGetContent取出其内容;
l 用xmlHasProp查找含有某个属性的节点;
l 取出该节点的属性集合,用xmlGetProp取出其属性值;
l 用xmlFreeDoc函数关闭文档指针,并清除本文档中所有节点动态申请的内存。
注意:节点列表的指针依然是xmlNodePtr,属性列表的指针也是xmlAttrPtr,并没有xmlNodeList或者xmlAttrList这样的类型。看作列表的时候使用它们的next和prev链表指针来进行轮询。只有在Xpath中有xmlNodeSet这种类型,其使用方法前面已经介绍了。
程序实例1:
#include </usr/include/libxml2/libxml/parser.h>
#include </usr/include/libxml2/libxml/tree.h>
int main(int argc , char **argv)
{
//定义文档指针以便后面获取文档指针
xmlDocPtr pdoc = NULL;
//定义一个根结点
xmlNodePtr proot=NULL , pcurnode = NULL;
//要解析的文件
char *psfilename=(const char*)"input.xml";
//获取要读的文件数并传指针
pdoc = xmlReadFile(psfilename ,"UTF-8",XML_PARSE_RECOVER);
//判断指针是否获取成功,失败的情况
if(NULL == pdoc)
{
printf("error: open file %s" , psfilename);
exit(1);
}
//获取根结点给pcurnode
pcurnode = xmlDocGetRootElement(pdoc);
//判断根结点是否获取成功
if(NULL == pcurnode)
{
printf("error: empty document %s" , psfilename);
exit(1);
}
//判断此结点是不是想要的结点(通过名字比较),相同为0,不同为1
if(xmlStrcmp(pcurnode->name , BAD_CAST "plist") != 0)
{
printf("error document " );
exit(1);
}
//如果该结点拥有此属性,进行输出属性值
if(xmlHasProp(pcurnode ,BAD_CAST "version"))
{
//先获取相应属性值
xmlChar *szAttr = xmlGetProp(pcurnode, BAD_CAST "version");
//输出此属性值
printf("version : %s \n" , szAttr);
}
//释放文档指针
xmlFreeDoc(pdoc);
xmlCleanupParser();
return(0);
}
涉及函数:
xmlParseFile,xmlReadFile,xmlDocGetRootElement,xmlHasProp,xmlGetProp。其中xmlParseFile和xmlReadFile都具备打开XML文件的功能,xmlParseFile函数以默认方式读入一个UTF-8格式的文档,并返回文档指针。xmlReadFile函数读入一个带有某种编码的xml文档,并返回文档指针。
解析字符串xml的话就需要:
string s;
pdoc = xmlRecoverDoc(BAD_CAST s.c_str());
但是要求字符串没有回车每个结点之间不能有空格
例如: <><><><><>紧凑排列