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

  • 相关阅读:
    Fiddler响应post的请求 request body里面填写什么?
    intellij idea 插件 ideaVim 用法
    Ubuntu 配置有线网 IP
    Git TortoiseGit SSH设置
    QT+QT creator+OpenCV图像灰度化
    用的最多的Android Studio 快捷键
    做高通平台安卓驱动感言
    《高可用MySQL》2 – 单机版MySQL主从配置
    JAVA学习第四十七课 — IO流(一):文件的读写
    hive 配置文件以及join中null值的处理
  • 原文地址:https://www.cnblogs.com/tianya10319/p/2036901.html
Copyright © 2011-2022 走看看