zoukankan      html  css  js  c++  java
  • TinyXML解析xml文档

    l        TinyXML简介

    TinyXML是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作,尤其适用于游戏开发,在Nebula2,CEGUI等开源项目中都有使用。

     

    名称

    访问接口

    是否支持验证

    备注

    Expat

    SAX/Local

    不清楚

    Local指它还有一套自己访问模型

    LibXML2

    SAX/DOM

    验证

     

    TinyXml

    DOM

     

    XML4C

    SAX/DOM

    验证

    不过用了ICU,国际化似乎更好

    Xerces-C

    SAX/DOM

    验证

     

    XML Booster

    Local

    不清楚

    估计效率应该很高

     

     

    l        关于DOM和SAX

    DOM - Document Object Model

    将整篇XML文档一次性解析并读入内存,保存为一个对象供用户访问。

    SAX - Simple API for XML

    SAX的XML解析方式是基于事件回调的,解析器在每遇到一个XML元素时都会产生一个事件,并执行由用户提供的处理函数。

     l        TinyXML类结构

     

    [TiXmlBase] 所有TinyXML类的基类,保存该结点或属性在XML原文中的信息。

    [TiXmlAttribute] XML结点属性,一个键值对

    [TiXmlNode] XML结点的基类,封装了对XML文档树形结构进行操作和维护的方法

    [TiXmlComment] XML注释结点

    [TiXmlDeclaration] XML声明结点

    [TiXmlDocument] XML文档结点(一般为一篇XML文档的根结点)

    [TiXmlElement] XML结点

    [TiXmlText] XML文本结点

    [TiXmlUnknown] 含有未知标签的XML结点

    [TiXmlHandle] 封装了一个结点的指针,在对该指针进行查询时将自动进行空指针交验

    [TiXmlVisitor] 遍历器接口,描述了每个节点的处理方法,由子类实现

    [TiXmlPrinter] Printer遍历器

     l        读取XML文件

    TiXmlDocument doc("test.xml");

    doc.LoadFile("test.xml");

     l        写入XML文件

    TiXmlDocument doc;

    ……

    doc.SaveFile("test.xml");

     l        遍历XML文档

    首先以FirstChild获得第一个自节点,然后以NextSibling获取下个兄弟节点;如此递归遍历所有节点即可。

    TiXmlNode::FirstChild();

    TiXmlNode::NextSibling();

     l        构造XML文档

    将指定节点插入当前节点子节点队列的末尾

    TiXmlNode::LinkEndChild();

    设置指定节点的属性

    TiXmlElement::SetAttribute();

    TiXmlElement::SetDoubleAttribute();

     

    TinyXML是个解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。它由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以用它的东西了。如果需要,可以将它做成自己的DLL来调用。举个例子就可以说明一切。

    对应的XML文件:

    <Persons>
        <Person ID="1">

            <name>phinecos</name>
            <age>22</age>
        </Person>
    </Persons>

    读写XML文件的程序代码:

    #include <iostream>
    #include "tinyxml.h"
    #include "tinystr.h"
    #include <string>
    #include <windows.h>
    #include <atlstr.h>
    using namespace std;

    CString GetAppPath()
    {//获取应用程序根目录
        TCHAR modulePath[MAX_PATH];
        GetModuleFileName(NULL, modulePath, MAX_PATH);
        CString strModulePath(modulePath);
        strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
        return strModulePath;
    }

    bool CreateXmlFile(string& szFileName)
    {//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
        try
         {
            //创建一个XML的文档对象。
            TiXmlDocument *myDocument = new TiXmlDocument();
            //创建一个根元素并连接。
            TiXmlElement *RootElement = new TiXmlElement("Persons");
            myDocument->LinkEndChild(RootElement);
            //创建一个Person元素并连接。
            TiXmlElement *PersonElement = new TiXmlElement("Person");
            RootElement->LinkEndChild(PersonElement);
            //设置Person元素的属性。
            PersonElement->SetAttribute("ID", "1");
            //创建name元素、age元素并连接。
            TiXmlElement *NameElement = new TiXmlElement("name");
            TiXmlElement *AgeElement = new TiXmlElement("age");
            PersonElement->LinkEndChild(NameElement);
            PersonElement->LinkEndChild(AgeElement);
            //设置name元素和age元素的内容并连接。
            TiXmlText *NameContent = new TiXmlText("周星星");
            TiXmlText *AgeContent = new TiXmlText("22");
            NameElement->LinkEndChild(NameContent);
            AgeElement->LinkEndChild(AgeContent);
            CString appPath = GetAppPath();
            string seperator = "\\";
            string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
            myDocument->SaveFile(fullPath.c_str());//保存到文件
        }
        catch (string& e)
         {
            return false;
        }
        return true;
    }

    bool ReadXmlFile(string& szFileName)
    {//读取Xml文件,并遍历
        try
         {
            CString appPath = GetAppPath();
            string seperator = "\\";
            string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
            //创建一个XML的文档对象。
            TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
            myDocument->LoadFile();
            //获得根元素,即Persons。
            TiXmlElement *RootElement = myDocument->RootElement();
            //输出根元素名称,即输出Persons。
            cout << RootElement->Value() << endl;
            //获得第一个Person节点。
            TiXmlElement *FirstPerson = RootElement->FirstChildElement();
            //获得第一个Person的name节点和age节点和ID属性。
            TiXmlElement *NameElement = FirstPerson->FirstChildElement();
            TiXmlElement *AgeElement = NameElement->NextSiblingElement();
            TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
            //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
            cout << NameElement->FirstChild()->Value() << endl;
            cout << AgeElement->FirstChild()->Value() << endl;
            cout << IDAttribute->Value()<< endl;
        }
        catch (string& e)
        {
            return false;
        }
        return true;
    }
    int main()
    {
        string fileName = "info.xml";
        CreateXmlFile(fileName);
        ReadXmlFile(fileName);
    }
    /////////////////////////////////////OVER//////////////////////////////////////////

    转载:http://blog.csdn.net/zhoubl668/archive/2008/12/29/3635320.aspx

  • 相关阅读:
    不务正业系列-浅谈《过气堡垒》,一个RTS玩家的视角
    [LeetCode] 54. Spiral Matrix
    [LeetCode] 40. Combination Sum II
    138. Copy List with Random Pointer
    310. Minimum Height Trees
    4. Median of Two Sorted Arrays
    153. Find Minimum in Rotated Sorted Array
    33. Search in Rotated Sorted Array
    35. Search Insert Position
    278. First Bad Version
  • 原文地址:https://www.cnblogs.com/tianya10319/p/2036901.html
Copyright © 2011-2022 走看看