天天看点

C++之tinyXML使用

 tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你的工程中,没有STL也可以编译运行。 

    下面我从这几个方面谈谈对tinyXML类库的使用以及理解。 

    首先在sourceforge上下载tinyXML类库,地址: http://sourceforge.net/projects/tinyxml/  

    然后解压缩tinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。在需要操作xml文件的地方,使用如下代码,就可以引入tinyXML类库。

 下面我用个简单的例子说明如何使用tinyXML操作xml文件。在讲例子之前我先说说tinyXML中主要类和xml文档之间的对应关系。下面是tinyXML中主要class的类图,反应各个类之间的静态关系。 

引用来自tinyXML文档

C++之tinyXML使用

    TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下: 

Xml代码  

C++之tinyXML使用
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <phonebook>  
  3.     <!--one item behalfs one contacted person.-->  
  4.     <item>  
  5.         <name>miaomaio</name>  
  6.     <addr>Shaanxi Xi'an</addr>  
  7.     <tel>13759911917</tel>  
  8.     <email>[email protected]</email>  
  9.     </item>  
  10.     <item>  
  11.         <name>gougou</name>  
  12.     <addr>Liaoning Shenyang</addr>  
  13.     <tel>15840330481</tel>  
  14.     <email>[email protected]</email>  
  15.     </item>  
  16.     <!--more contacted persons.-->  
  17. </phonebook>  
  • 像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
  • 像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted persons.-->,
  • 像TiXmlDocument指的就是整个xml文档,
  • 像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,
  • 像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,
  • 像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
  • 除此之外就是TiXmlUnknown。
  • DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

    如下是一个XML片段:

    C++之tinyXML使用
        < Persons >
    C++之tinyXML使用
             < Person  ID ="1" >
    C++之tinyXML使用
                 < name >周星星 </ name >
    C++之tinyXML使用
                 < age >20 </ age >
    C++之tinyXML使用
             </ Person >
    C++之tinyXML使用
             < Person  ID ="2" >
    C++之tinyXML使用
                 < name >白晶晶 </ name >
    C++之tinyXML使用
                 < age >18 </ age >
    C++之tinyXML使用
             </ Person >
    C++之tinyXML使用
         </ Persons >
    C++之tinyXML使用

     在TinyXML中,根据XML的各种元素来定义了一些类:

    TiXmlBase:整个TinyXML模型的基类。

    TiXmlAttribute:对应于XML中的元素的属性。

    TiXmlNode:对应于DOM结构中的节点。

    TiXmlComment:对应于XML中的注释

    TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。

    TiXmlDocument:对应于XML的整个文档。

    TiXmlElement:对应于XML的元素。

    TiXmlText:对应于XML的文字部分

    TiXmlUnknown:对应于XML的未知部分。 

    TiXmlHandler:定义了针对XML的一些操作。

    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文件:

    C++之tinyXML使用
    < Persons >
    C++之tinyXML使用
         < Person  ID ="1" >
    C++之tinyXML使用
             < name >phinecos </ name >
    C++之tinyXML使用
             < age >22 </ age >
    C++之tinyXML使用
         </ Person >
    C++之tinyXML使用
    </ Persons >
    C++之tinyXML使用

    读写XML文件的程序代码:

    #include <iostream>

  • C++之tinyXML使用
    #include "tinyxml.h"
    C++之tinyXML使用
    #include "tinystr.h"
    C++之tinyXML使用
    #include <string>
    C++之tinyXML使用
    #include <windows.h>
    C++之tinyXML使用
    #include <atlstr.h>
    C++之tinyXML使用
    using namespace std;
    C++之tinyXML使用
    C++之tinyXML使用
    CString GetAppPath()
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {//获取应用程序根目录
    C++之tinyXML使用
        TCHAR modulePath[MAX_PATH];
    C++之tinyXML使用
        GetModuleFileName(NULL, modulePath, MAX_PATH);
    C++之tinyXML使用
        CString strModulePath(modulePath);
    C++之tinyXML使用
        strModulePath = strModulePath.Left(strModulePath.ReverseFind(_T('\\')));
    C++之tinyXML使用
        return strModulePath;
    C++之tinyXML使用
    }
    C++之tinyXML使用
    C++之tinyXML使用
    bool CreateXmlFile(string& szFileName)
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {//创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
    C++之tinyXML使用
        try
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {
    C++之tinyXML使用
            //创建一个XML的文档对象。
    C++之tinyXML使用
            TiXmlDocument *myDocument = new TiXmlDocument();
    C++之tinyXML使用
            //创建一个根元素并连接。
    C++之tinyXML使用
            TiXmlElement *RootElement = new TiXmlElement("Persons");
    C++之tinyXML使用
            myDocument->LinkEndChild(RootElement);
    C++之tinyXML使用
            //创建一个Person元素并连接。
    C++之tinyXML使用
            TiXmlElement *PersonElement = new TiXmlElement("Person");
    C++之tinyXML使用
            RootElement->LinkEndChild(PersonElement);
    C++之tinyXML使用
            //设置Person元素的属性。
    C++之tinyXML使用
            PersonElement->SetAttribute("ID", "1");
    C++之tinyXML使用
            //创建name元素、age元素并连接。
    C++之tinyXML使用
            TiXmlElement *NameElement = new TiXmlElement("name");
    C++之tinyXML使用
            TiXmlElement *AgeElement = new TiXmlElement("age");
    C++之tinyXML使用
            PersonElement->LinkEndChild(NameElement);
    C++之tinyXML使用
            PersonElement->LinkEndChild(AgeElement);
    C++之tinyXML使用
            //设置name元素和age元素的内容并连接。
    C++之tinyXML使用
            TiXmlText *NameContent = new TiXmlText("周星星");
    C++之tinyXML使用
            TiXmlText *AgeContent = new TiXmlText("22");
    C++之tinyXML使用
            NameElement->LinkEndChild(NameContent);
    C++之tinyXML使用
            AgeElement->LinkEndChild(AgeContent);
    C++之tinyXML使用
            CString appPath = GetAppPath();
    C++之tinyXML使用
            string seperator = "\\";
    C++之tinyXML使用
            string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
    C++之tinyXML使用
            myDocument->SaveFile(fullPath.c_str());//保存到文件
    C++之tinyXML使用
        }
    C++之tinyXML使用
        catch (string& e)
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {
    C++之tinyXML使用
            return false;
    C++之tinyXML使用
        }
    C++之tinyXML使用
        return true;
    C++之tinyXML使用
    }
    C++之tinyXML使用
    C++之tinyXML使用
    bool ReadXmlFile(string& szFileName)
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {//读取Xml文件,并遍历
    C++之tinyXML使用
        try
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {
    C++之tinyXML使用
            CString appPath = GetAppPath();
    C++之tinyXML使用
            string seperator = "\\";
    C++之tinyXML使用
            string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
    C++之tinyXML使用
            //创建一个XML的文档对象。
    C++之tinyXML使用
            TiXmlDocument *myDocument = new TiXmlDocument(fullPath.c_str());
    C++之tinyXML使用
            myDocument->LoadFile();
    C++之tinyXML使用
            //获得根元素,即Persons。
    C++之tinyXML使用
            TiXmlElement *RootElement = myDocument->RootElement();
    C++之tinyXML使用
            //输出根元素名称,即输出Persons。
    C++之tinyXML使用
            cout << RootElement->Value() << endl;
    C++之tinyXML使用
            //获得第一个Person节点。
    C++之tinyXML使用
            TiXmlElement *FirstPerson = RootElement->FirstChildElement();
    C++之tinyXML使用
            //获得第一个Person的name节点和age节点和ID属性。
    C++之tinyXML使用
            TiXmlElement *NameElement = FirstPerson->FirstChildElement();
    C++之tinyXML使用
            TiXmlElement *AgeElement = NameElement->NextSiblingElement();
    C++之tinyXML使用
            TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
    C++之tinyXML使用
            //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
    C++之tinyXML使用
            cout << NameElement->FirstChild()->Value() << endl;
    C++之tinyXML使用
            cout << AgeElement->FirstChild()->Value() << endl;
    C++之tinyXML使用
            cout << IDAttribute->Value()<< endl;
    C++之tinyXML使用
        }
    C++之tinyXML使用
        catch (string& e)
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {
    C++之tinyXML使用
            return false;
    C++之tinyXML使用
        }
    C++之tinyXML使用
        return true;
    C++之tinyXML使用
    }
    C++之tinyXML使用
    int main()
    C++之tinyXML使用
    C++之tinyXML使用
    C++之tinyXML使用
    {
    C++之tinyXML使用
        string fileName = "info.xml";
    C++之tinyXML使用
        CreateXmlFile(fileName);
    C++之tinyXML使用
        ReadXmlFile(fileName);
    C++之tinyXML使用
    }
    C++之tinyXML使用