C++ TinyXml

前言

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

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的一些操作。

最简单的例子

我们在conf目录下建立student.xml,xml代码如下:

<School name="软件学院">  

    <Class name = "C++">  

        <Student name="tinyxml" number="123">  

            <email>tinyxml@163.com</email>  

            <address>中国</address>           

        </Student>  

        <Student name="jsoncpp" number="456">  

            <email>jsoncpp@gmail.com</email>  

            <address>美国</address>           

        </Student>  

    </Class>  

</School>

按 Ctrl+C 复制代码

使用tinyxml,我们只需要在头文件中包含 <tinyxml.h>就行了。

打印整个XML代码如下:

void printSchoolXml() {

    using namespace std;

    TiXmlDocument doc;  

    const char * xmlFile = "conf/school.xml";   

    if (doc.LoadFile(xmlFile)) {    

        doc.Print();  

    } else {

        cout << "can not parse xml conf/school.xml" << endl;

    }   

}

读取XML

代码如下:

void readSchoolXml() {

    using namespace std;

    const char * xmlFile = "conf/school.xml";

    TiXmlDocument doc;                              

    if (doc.LoadFile(xmlFile)) {

        doc.Print();

    } else {

        cout << "can not parse xml conf/school.xml" << endl;

        return;

    }

    TiXmlElement* rootElement = doc.RootElement();  //School元素  

    TiXmlElement* classElement = rootElement->FirstChildElement();  // Class元素

    TiXmlElement* studentElement = classElement->FirstChildElement();  //Students  

    for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {

        TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的name属性  

        for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {

            cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;       

        }                                 


        TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式 

        for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {

            string contactType = studentContactElement->Value();

            string contactValue = studentContactElement->GetText();

            cout << contactType  << " : " << contactValue << std::endl;           

        }   

     

    } 

}

写入xml

这里我们将通过xml写入代码操作,写入几乎和conf/school.xml同样内容到conf/school-write.xml,代码如下:

void writeSchoolXml() {

    using namespace std;

    const char * xmlFile = "conf/school-write.xml"; 

    TiXmlDocument doc;  

    TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");  

    TiXmlElement * schoolElement = new TiXmlElement( "School" );  

    TiXmlElement * classElement = new TiXmlElement( "Class" );  

    classElement->SetAttribute("name", "C++");


    TiXmlElement * stu1Element = new TiXmlElement("Student");

    stu1Element->SetAttribute("name", "tinyxml");

    stu1Element->SetAttribute("number", "123");

    TiXmlElement * stu1EmailElement = new TiXmlElement("email");

    stu1EmailElement->LinkEndChild(new TiXmlText("tinyxml@163.com") );

    TiXmlElement * stu1AddressElement = new TiXmlElement("address");

    stu1AddressElement->LinkEndChild(new TiXmlText("中国"));

    stu1Element->LinkEndChild(stu1EmailElement);

    stu1Element->LinkEndChild(stu1AddressElement);


    TiXmlElement * stu2Element = new TiXmlElement("Student");

    stu2Element->SetAttribute("name", "jsoncpp");

    stu2Element->SetAttribute("number", "456");

    TiXmlElement * stu2EmailElement = new TiXmlElement("email");

    stu2EmailElement->LinkEndChild(new TiXmlText("jsoncpp@163.com"));

    TiXmlElement * stu2AddressElement = new TiXmlElement("address");

    stu2AddressElement->LinkEndChild(new TiXmlText("美国"));

    stu2Element->LinkEndChild(stu2EmailElement);

    stu2Element->LinkEndChild(stu2AddressElement);


    classElement->LinkEndChild(stu1Element);  

    classElement->LinkEndChild(stu2Element);  

    schoolElement->LinkEndChild(classElement);  

    

    doc.LinkEndChild(decl);  

    doc.LinkEndChild(schoolElement); 

    doc.SaveFile(xmlFile);  

}

下载工程

点击下载

更多操作

  请参考 http://www.grinninglizard.com/tinyxmldocs/tutorial0.html
  http://blog.csdn.net/clever101/article/details/5334369

  http://www.grinninglizard.com/tinyxmldocs/index.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值