`
CJxixi
  • 浏览: 104293 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    C/C++使用tinyxml读写XML文档

    个人感觉和java的xml解析类很相似,内附样例程序,不过最好还是到网上搜搜其他人的例子(PS:如果你不想看源码的话),网上发部的例子都是new了xmldocumen对象,(添加的元素节点都是以new的方式)却没有释放,这个...

    TinyXml源码下载

    用于C++解析XML文件,可同时在Linux和Windows下使用

    tinyxml与tinyxml2

    tinyxml与tinyxml2两个版本的源码,操作xml很方便,解压可以直接使用.

    C++ 使用TinyXML解析XML文件 源码

    C++ 使用TinyXML解析XML文件,简单清晰,仅供参考。读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库

    tinyxml2源码及示例

    适用于桌面系统和移动系统tinyxml2

    tinyxml_2_6_2 库(动态库和静态库)

    下载了官方的 tinyxml_2_6_2 的库,只支持静态编译。自己修改了工程属性配置把静态库配置改为了生成动态库的工程。 文件包含了: tinyxml_2_6_2动态库.rar (修改版) 以及包含了工程文件以及编译好的DLL了。 tiny...

    Tinyxml 源代码(VC6 & VS2005)

    TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。 ...

    TinyXML指南[中文].pdf

    TinyXML使用文档对象模型(DOM),这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。

    tinyxml的源码工程 vs2010

    小巧的xml工具,包含vs2010工程文件,可直接打开编译

    TinyXML_v2.5.3(支持C/C++的轻量级XML文档解析器)(含解析器源码和文档)

    一款轻量级的XML解析器,能够容易的解决中文问题 如果你要做的东西不是非常大的项目的话,比较...rar压缩包中包含了TinyXML解析器配套的文档,支持C、c++的轻量级的XML文档解析器,支持中文,非常适合不太大的项目

    tinyxml源代码

    解析xml的tinyxml源代码,适合c++开发者

    tinyxml_2_6_2.rar

    tinyxml源码,TinyXML2是simple、small、efficient开源的C++ XML文件解析库,可以很方便的应用到现有的项目之中。非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。

    tinyxml源码

    tinyxml.cpp、tinyxml.h、tinyxmlerror.cpp、tinyxmlparser.cpp

    tinyxml编译好的

    tinyxml是解析xml非常方便的开发源码,适用于C++xml协议格式方面的开发。

    tinyxml 源码

    TinyXML:一个优秀的C++ XML解析器。个人感觉TinyXML是使用起来最舒服的,因为它的API接口,面向对象性很好

    xml文件解析(tiny xml)

    很不错的xml解析源码 源码c++的,vc6下使用,编译无错

    tinyxml(c++的XML解析器)

    功能强大的c++的XML解析器, &lt;br&gt;推荐下载, 源码+示例

    tinyxml+tinyxpath组合编程套件,很好的编程工具,都是源码

    TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器 一. XML解析模型: 目前XML的解析主要有两大模型:SAX和DOM。 SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应...

    TinyXML源码

    TinyXML是一个简单小巧,可以很容易集成到其它程序中的C++ XML解析器。 它能做些什么 简单地说,TinyXML解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言“...

    xml4wrapper_3.6.2.7z

    Summary: xml4wrapper 3.6.2, 支持libxml2-2.7.8 或 xercesc2.8或tinyxml2或rapidxml封装的xml配置文件解析和操作统一C++接口, 支持XPATH的方式访问和操作XML节点信息. 操作非常相当之方便, 相应库的更高版本也行...

Global site tag (gtag.js) - Google Analytics