Author:张继飞
<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel>
<title>channel_title</title>
<description>channel_description</description>
<link>channel_link</link>
<language>channel_language</language>
<item>
<title>item1_title</title>
<description>item1_description</description>
<link>item1_link</link>
</item>
<item>
<title>item2_title</title>
<description>item2_title</description>
<link>item2_title</link>
</item>
</channel>
</rss>
今天由于被这个元素的问题搞晕了,以至于没有考虑到空白符。
其实理解起来很简单,<></>为一个层,所以rss为根节点,然后channel为第二层节点,title,description,link,language,items为第三层节点,items里面的title,description,link为第四层节点。(前提是忽略空白符节点)
下面给出一段程序,并解释了何时使用children,何时使用next,哈哈哈:
#include <iostream>
#include <libxml/parser.h>
#include <libxml/tree.h>
using namespace std;
int main(int argc,char** argv)
{
xmlDocPtr doc=NULL;
xmlNodePtr cur=NULL;
xmlNodePtr child=NULL;
char* name=NULL;
char* value=NULL;
xmlKeepBlanksDefault (0);
if(argc<2)
{
cout<<"argc must be 2 or above."<<endl;
return -1;
}
doc=xmlParseFile(argv[1]);//创建Dom树
if(doc==NULL)
{
cout<<"Loading xml file failed."<<endl;
exit(1);
}
cur=xmlDocGetRootElement(doc);//获取根节点
if(cur==NULL)
{
cout<<"empty file"<<endl;
xmlFreeDoc(doc);
exit(2);
}
//walk the tree
printf("cur1=%s\n",cur->name);//rss
cur=cur->xmlChildrenNode;//get sub node
if(xmlStrcmp(cur->name, BAD_CAST "channel"))
{
printf("parser err!\n");
xmlFreeDoc(doc);
xmlCleanupParser();
return 0;
}
printf("cur2=%s\n",cur->name);//chanle
cur=cur->xmlChildrenNode;
printf("cur2=%s\n",cur->name);
while(xmlStrcmp(cur->name, BAD_CAST "item"))
{
cur=cur->next;
printf("cur3=%s\n",cur->name);
}
while(cur != NULL)
{
child=cur->xmlChildrenNode;
printf("cur4=%s\n",cur->name);
while(child != NULL)
{
name=(char*)(child->name);
value=(char*)xmlNodeGetContent(child);
cout<<"name is: "<<name<<", value is: "<<value<<endl;
xmlFree(value);
child=child->next;
}
cur = cur->next;
}
xmlFreeDoc(doc);//释放xml解析库所用资源
xmlCleanupParser();
return 0;
}