PS:本人在用libxml2解析xml文件时,涉及到多叉树的遍历,网上找了很多资料,只有简单的读取,特此整理如下:c语言实现
网上的资料所解析的节点都是子节点层次比较少,但当树的节点层次多而且复杂时,往往就解析不成功了;一下是基于用libxml2库解析xml文件所涉及到的多叉树,xml函数会给出相应的函数说明:
szDocName是xml文件名.
xmlNodePtr curNode; //定义结点指针
doc = xmlParseFile(szDocName);
if (NULL == doc)
{
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
curNode = xmlDocGetRootElement(doc); //确定文档根元素
/*检查确认当前文档中包含内容*/
if (NULL == curNode)
{
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}
szRootName = curNode->name; 用来保存根节点名,方面下面递归函数结束的判断!
PrintXmlNodeInfo(doc,curNode->children);
由此要进入递归函数PrintXmlNodeInfo;
void PrintXmlNodeInfo(xmlDocPtr doc,xmlNodePtr curNode)
{
if(curNode != NULL)
{
print(doc,curNode); 在此打印节点信息!
if(curNode->children != NULL)
{
//进入子节点
PrintXmlNodeInfo(doc,curNode->children);
}
else
{
//没有子节点,有无next节点
if(curNode->next != NULL)
{
//进入next节点
PrintXmlNodeInfo(doc,curNode->next);
}
else
{
//回溯父节点,进入父节点的next节点
curNode = curNode->parent;
while(curNode->next == NULL)
{
curNode = curNode->parent;
if(!xmlStrcmp(curNode->name,BAD_CAST(szRootName)))
{
return;
}
}
PrintXmlNodeInfo(doc,curNode->next);
}
}
}
else
{
return;
}
}
至此,一般xml文件节点信息都可以打印出来,但是会出现这个问题:test:(null);text节点又不在xml文件中有。估计这个涉及到libxml2库函数的接口调用,本人还没有解决,希望各位高手有什么意见和想法多多提出来。。。
(ps:第一次发博客。。)
其实不用这么麻烦,递归函数还可以写的简便些,如下所示:
if(curNode != NULL)
{
printxml(curNode);
PrintXmlNodeInfo(doc,curNode->children);
PrintXmlNodeInfo(doc,curNode->next);
} 至此完毕,这也算是对之前的纠正!!