Xml遍历读取

本文使用的是libxml库进行遍历xml文件,读取想要的属性和文本信息。
首先引用所需的头文件和添加库。

#include <libxml\parser.h>
#pragma comment(lib,"iconv.lib");
#pragma comment(lib,"libxml2.lib");
//记得一共有三个库,但是我目前只包含了这两个

/* xml的结构类似树,所以使用的时候有点类似 */

我的程序比较繁琐而且欠缺优化,仅仅目前可用,占用内存以及系统开销都挺大。

ReadFileGetAllNeeds()
{
    xmlKeepBlankDefault(0);                     
    //这句话是去掉每个Node之间的空白Node否则会出现系统填充的空白Node(个人理解)

    //定义待解析的文档指针。
    xmlNodePtr pDoc = NULL;
    //定义了根节点的指针
    xmlNodePtr RootNode = NULL;                 


    char szDocName[] = "E:\\Demo.xml";              
    //打开指定的文件
    pDoc = xmlReadFile(szDocName. "UTF-8",XML_PARSE_RECOVER);     
    //按照指定的编码格式解析文件
    if(NULL == pDoc)
    {
        cout<<"Error Open File"<<endl;
        return -1;
    }

    RootNode = xmlDocGetRootElement(pDoc);                  
    //获取根节点
    if(NULL == RootNode)
    {
        cout<<"Is Empty File"<<endl;
        return -2;
    }

    //判断Root是否正确,且是我们需要的,这里是"Events"
    if(xmlStrcmp(curNode->name,BAD_CAST"Events"))
    {
        cout<<"Error RootNode"<<endl;
        return -3; 
    }
    //由于获取的结构内信息比较多,这里就不一一列举,可以进入调试模式,在监视窗口进行查看。
    cout<<"RootNode is :"<< RootNode->name <<endl;

    //下面遍历所有的节点,当前Xml文件Root节点不需要信息,所以不处理
    xmlNodePtr pTravelXml = RootNode->children; 
    //每个chidren都是一个孩子节点,孩子节点下还可能会有孩子节点


    //根据Xml文件的格式,和所需求的内容不同,读取或过滤的方式不同
    //这个循环体对所有的儿子节点进行遍历,在内部可以对孙子或者更深的进行操作
    while(pTravelXml)
    {   pFind = pTravelXml;
        while(pFind)      //对当前儿子节点进行遍历
        {
            if (!xmlStrcmp(pFind->name,BAD_CAST"Execution"))
            {
                //找到了"Execution"节点
                //<Execution ProcessId=0xac3 ...>
                //获取属性ProcessID信息。
                char* szProcessId = (char*)xmlGetProp(pFind,BAD_CAST "ProcessID");
                cout << szProcessId << endl;
                xmlFree(szProcessId);
                //并非智能指针需要手动进行释放,所有的都是
                szProcessId = NULL;


                //获取文本信息
                //<Execution ...> Content </>
                char* szBtye = (char*)xmlNodeGetContent(pFind);
                //操作之后进行释放
                xmlFree(szBtye);
                szBtye = NULL;
            }
            pFind = pFind->next;
        }

        pTravelXml = pTravelXml->next;      
        //如果当前结点存在兄弟节点,则next就到了兄弟节点
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇