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

    下载和编译

    本文运行环境是: Redhat 5.5 + g++version 4.6.1 +  GNU Make 3.81 + tinyxml_2_6_2

    下载地址是:http://sourceforge.net/projects/tinyxml/

    解压之后得到文件夹tinyxml,tinyxml的头文件和cpp文件,都在这个文件夹,为了我们的管理我们的项目工程,我们还是把tinyxml做一个整理。

    由于tinyxml不仅支持Linux编译,同时也支持windows下编译,所以解压之后不仅有h文件,cpp文件,还有vc工程的一些工程文件,这里我们只在Linux上使用,所以只留下h文件和cpp文件,其他文件一概删除

    这里我列出整理后的工作目录:

    复制代码
    tinyxml/           //工作目录
    |-- include //头文件根目录
    |  |-- tinyxml //tinyxml头文件,包括tinystr.h tinyxml.h
    |-- src //cpp源码文件根目录
      |-- tinyxml //tinyxml源码文件夹,包括tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp
      |-- main.cpp //我们的主函数,调用tinyxml的示例代码
    |-- conf //我们示例中用的xml文件所在的文件夹
    |-- makefile //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践
    复制代码

    最简单的例子

    我们在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>
    复制代码

    使用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);
    }
    复制代码

    下载工程

    点击下载

    下载之后的编译和运行步骤

    unzip tinyxml.zip
    cd tinyxml
    make
    ./main

    更多操作

      请参考 http://www.grinninglizard.com/tinyxmldocs/tutorial0.html

  • 相关阅读:
    Linux添加PATH,即命令自动补全功能
    编程的奥义
    Windows SDK笔记
    一个烂电源,毁了我一天的工作
    贪念
    VC菜菜鸟创建一个即时串口通信程序
    IP视频监控系统开放式平台的5个标志
    敷铜的入门
    解决:Ulead VideoStudio 启动黑屏的问题
    数据结构中,关于“大小端”的数据存储方式的相关问题
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4504586.html
Copyright © 2020-2023  润新知