TinyXML2开源库使用

相关文章

TinyXML2 学习: http://www.tuicool.com/articles/uYBB7j

C++使用tinyxml创建和解析xml文件(本文用于cocos2dx):http://blog.csdn.net/u012234115/article/details/38643259

声明

我是由于工作原因使用的tinyXML,源码是直接由老大提供给我的,与网上流传的不太一样,所以我也不知道下载链接在哪,但是我会在文章末尾附带的源码

前言

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

TinyXML介绍

在TinyXML中,根据XML的各种元素来定义了一些类:
    XmlBase:整个TinyXML模型的基类。
    XmlAttribute:对应于XML中的元素的属性。
    XmlNode:对应于DOM结构中的节点。
    XmlComment:对应于XML中的注释。
    XmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
    XmlDocument:对应于XML的整个文档。
    XmlElement:对应于XML的元素。
    XmlText:对应于XML的文字部分。
    XmlUnknown:对应于XML的未知部分。 
    XmlHandler:定义了针对XML的一些操作。

应用实例

通过对下面这个XML进行创建,读取来熟悉API
<?xml version="1.0"?>  
<School name="软件学院">  
    <Class name = "C++">  
        <Student name="tinyxml" number="123">  
            <email>[email protected]</email>  
            <address>中国</address>           
        </Student>  
        <Student name="jsoncpp" number="456">  
            <email>[email protected]</email>  
            <address>美国</address>           
        </Student>  
    </Class>  
</School> 

创建XML

bool createXML()
{
    XMLDocument *doc = new XMLDocument;

    XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"GBK\"");
    doc->LinkEndChild(declaration);
    XMLElement *eleSchool = doc->NewElement("School");
    doc->LinkEndChild(eleSchool);

    eleSchool->SetAttribute("name", "软件学院");    //设置属性

    XMLElement *eleClass = doc->NewElement("Class");
    eleSchool->LinkEndChild(eleClass);  //挂在School节点上
    eleClass->SetAttribute("name", "C++");

    //------------------------------第一个学生
    XMLElement *eleStudent = doc->NewElement("Student");
    eleClass->LinkEndChild(eleStudent); //挂在School节点上
    //可以设置多个属性
    eleStudent->SetAttribute("name", "tinyxml");
    eleStudent->SetAttribute("number", 123);

    XMLElement *eleEmail = doc->NewElement("email");
    eleStudent->LinkEndChild(eleEmail);
    XMLText *texEmail = doc->NewText("[email protected]");
    eleEmail->LinkEndChild(texEmail);

    XMLElement *eleAddress = doc->NewElement("address");
    eleStudent->LinkEndChild(eleAddress);
    XMLText *texAddress = doc->NewText("中国");
    eleAddress->LinkEndChild(texAddress);

    //------------------------------第二个学生
    XMLElement *eleStudent1 = doc->NewElement("Student");
    eleClass->LinkEndChild(eleStudent1);    //挂在School节点上
    eleStudent1->SetAttribute("name", "jsoncpp");
    eleStudent1->SetAttribute("number", 456);

    XMLElement *eleEmail1 = doc->NewElement("email");
    eleStudent1->LinkEndChild(eleEmail1);
    XMLText *texEmail1 = doc->NewText("[email protected]");
    eleEmail1->LinkEndChild(texEmail1);

    XMLElement *eleAddress1 = doc->NewElement("address");
    eleStudent1->LinkEndChild(eleAddress1);
    XMLText *texAddress1 = doc->NewText("美国");
    eleAddress1->LinkEndChild(texAddress1);

    if (XML_SUCCESS != doc->SaveFile("e:/tmp.xml")) {
        delete doc;
        return false;
    }
    doc->SaveFile("e:/tmp.xml");
    delete doc;
    return true;
}

读取

bool ReadXml()
{

    XMLDocument doc;
    if (XML_SUCCESS != doc.LoadFile("e:/tmp.xml"))  //加载XML失败 返回false
    {
        return false;
    }

    XMLElement *eleSchool = doc.RootElement();  //获取根节点

    if (eleSchool)
    {
        cout << "School:" << eleSchool->Attribute("name") << endl;

        XMLElement* eleClass = eleSchool->FirstChildElement("Class");
        while (eleClass)
        {
            cout << " Class:" << eleClass->Attribute("name") << endl;
            XMLElement* eleStudent = eleClass->FirstChildElement("Student");
            while (eleStudent)
            {
                cout << " Student:" << eleStudent->Attribute("name") << ", " << eleStudent->Attribute("number") << endl;
                XMLElement* eleEmail = eleStudent->FirstChildElement("email");
                if (eleEmail)
                {
                    cout << " Email:" << eleEmail->GetText() << endl;
                }

                XMLElement* eleAddress = eleStudent->FirstChildElement("address");
                if (eleAddress)
                {
                    cout << " Address:" << eleAddress->GetText() << endl;
                }
                eleStudent = eleStudent->NextSiblingElement("Student");
            }

            eleClass = eleClass->NextSiblingElement();
        }
    }
}
XMLDocument::Parse( const char* p, size_t len )
这个函数可以直接解析XML格式的字符串
FirstChildElement(const char* value=0):获取第一个值为value的子节点,value默认值为空,则返回第一个子节点。
RootElement():获取根节点,相当于FirstChildElement的空参数版本;
const XMLAttribute* FirstAttribute() const:获取第一个属性值;
XMLHandle NextSiblingElement( const char* _value=0 ) :获得下一个节点。

下载地址

链接: http://pan.baidu.com/s/1pKDiU4V 密码: ea72

你可能感兴趣的:(xml,开源,开源库及项目)