分析rss/xml结构附带源码【原创】

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值