目录
一、文档简介:
本文档用于辅助使用者使用TinyXML解析模块进行开发工作。
TinyXML是一个开源的解析XML的解析库,主要作用是解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。XML的意思是“可扩展标记语言“(eXtensibleMarkupLanguage)。它允许你创建你自己的文档标记。TinyXML使用文档对象模型(DOM),DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。
该解析库可以在http://sourceforge.net/projects/tinyxml/files/下载。
开发环境参数:
操作系统:Ubuntu11.04
本机平台:X86
目标平台:Loongson1B开发板
交叉编译工具链:gcc-3.4.6-2f(1B交叉编译工具链)
所需软件及工具包:
TinyXML解析模块源码包:tinyxml.tgz
二、TinyXML解析及使用
TinyXML是个XML解析库,主要由DOM模型类(TiXmlBase、TiXmlNode、TiXmlAttribute、TiXmlComment、TiXmlDeclaration、TiXmlElement、TiXmlText、TiXmlUnknown)和操作类(TiXmlHandler)构成。解析库分别根据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模块由两个头文件(.h文件)和四个CPP文件(.cpp文件)构成,使用的时候,只要将(tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp)导入工程就可以使用了。
一般情况下,我们需要对XML的操作主要有以下几种情况的需求:
1.解析XML内容
2.构建XML内容
3.节点数据查询
4.节点数据删除
5.节点数据修改
6.其他
下边将主要讲述如何使用这些类及其函数接口来解析及构建XML:
1.解析XML
由首先准备一个XML片段,如下文件所示:
File:in_test.xml |
<Persons> <PersonID="1"> <name>小明</name> <age>20</age> </Person> <PersonID="2"> <name>小红</name> <age>30</age> </Person> </Persons> |
然后我们编写一段读取节点内容及属性的测试程序如下:
Function:boolAnalysXML(constchar*xml_file)//读取第一个节点的属性及内容 |
boolAnalysXML(constchar*xml_file) { //创建一个XML的文档对象。 TiXmlDocument*document=newTiXmlDocument(xml_file);//"传入XML文件名" if(NULL==document) { returnfalse; } document->LoadFile(); //获得根元素。 TiXmlElement*root_element=document->RootElement(); if(NULL==root_element) { returnfalse; } //获得第一个Person节点。 TiXmlElement*first_element=root_element->FirstChildElement(); if(NULL==first_element) { returnfalse; } //获得第一个Person的name节点和age节点和ID属性。 TiXmlElement*name_element=first_element->FirstChildElement(); if(NULL==name_element) { returnfalse; } TiXmlElement*age_element=name_element->NextSiblingElement(); if(NULL==age_element) { returnfalse; } TiXmlAttribute*id_attribute=first_element->FirstAttribute(); if(NULL==id_attribute) { returnfalse; } //输出XML内容到控制台 cout<<"AnalysXML:"<<endl; document->Print(stdout); //输出根元素名称,即输出Persons。 cout<<"Thefirstelement:"<<root_element->Value()<<endl; //输出第一个Person的name内容,age内容,ID属性。 cout<<"Thefirstchildelement:"<<name_element->FirstChild()->Value()<<endl; cout<<"Thesecondchildelement:"<<age_element->FirstChild()->Value()<<endl; cout<<"Thefirstchildelement'sattribute:"<<id_attribute->Value()<<endl; returntrue; } |
编译后执行可以看到控制台有如下输出:
#./xml_test
AnalysXML:
<Persons>
<PersonID="1">
<name>小明</name>
<age>20</age>
</Person>
<PersonID="2">
<name>小红</name>
<age>30</age>
</Person>
</Persons>
Thefirstelement:Persons
Thefirstchildelement:小明
Thesecondchildelement:20
Thefirstchildelement'sattribute:1
2.构建XML
下边是构建XML的例子,
Function:boolCreateXML(constchar*xml_file)//构建XML内容并保存到文件 |
boolCreateXML(constchar*xml_file) { //定义一个TiXmlDocument类指针 TiXmlDocument*document=newTiXmlDocument; if(NULL==document) { returnfalse; } //定义一个xml文件头部声明 TiXmlDeclaration*declaration=newTiXmlDeclaration(("1.0"),(""),("")); if(NULL==declaration) { returnfalse; } document->LinkEndChild(declaration); //生成一个根节点:MyApp TiXmlElement*first_element=newTiXmlElement(("MyApp")); if(NULL==first_element) { returnfalse; } document->LinkEndChild(first_element); //生成子节点:Messages TiXmlElement*child_element_messages=newTiXmlElement(("Messages")); if(NULL==child_element_messages) { returnfalse; } first_element->LinkEndChild(child_element_messages); //生成子节点:Welcome TiXmlElement*child_element_welcome=newTiXmlElement(("Welcome")); if(NULL==child_element_welcome) { returnfalse; } child_element_messages->LinkEndChild(child_element_welcome); //设置Welcome节点的值 constchar*str_value=("WelcometoMyApp"); TiXmlText*welcome_value=newTiXmlText(str_value); child_element_welcome->LinkEndChild(welcome_value); //生成子节点:Farewell TiXmlElement*child_element_farewell=newTiXmlElement(("Farewell")); if(NULL==child_element_farewell) { returnfalse; } child_element_messages->LinkEndChild(child_element_farewell); //设置Farewell节点的值 str_value=("ThankyouforusingMyApp"); TiXmlText*farewell_value=newTiXmlText(str_value); child_element_farewell->LinkEndChild(farewell_value); //生成子节点:Windows TiXmlElement*child_element_windows=newTiXmlElement(("Windows")); if(NULL==child_element_windows) { returnfalse; } first_element->LinkEndChild(child_element_windows); //生成子节点:Window TiXmlElement*child_element_window=newTiXmlElement(("Window")); if(NULL==child_element_window) { returnfalse; } child_element_windows->LinkEndChild(child_element_window); //设置节点Window的值 child_element_window->SetAttribute(("name"),("MainFrame")); child_element_window->SetAttribute(("x"),("5")); child_element_window->SetAttribute(("y"),("15")); child_element_window->SetAttribute(("w"),("400")); child_element_window->SetAttribute(("h"),("250")); //生成子节点:Connection TiXmlElement*child_element_connection=newTiXmlElement(("Connection")); if(NULL==child_element_connection) { returnfalse; } first_element->LinkEndChild(child_element_connection); //设置节点Connection的值 child_element_connection->SetAttribute(("ip"),("192.168.0.1")); child_element_connection->SetAttribute(("timeout"),("123.456000")); //保存至文件 document->SaveFile(xml_file); //输出到控制台 cout<<"CreatXML:"<<endl; document->Print(stdout); returntrue; } |
编译后执行可以看到控制台有如下输出:
#./xml_test
CreatXML:
<?xmlversion="1.0"?>
<MyApp>
<Messages>
<Welcome>WelcometoMyApp</Welcome>
<Farewell>ThankyouforusingMyApp</Farewell>
</Messages>
<Windows>
<Windowname="MainFrame"x="5"y="15"w="400"h="250"/>
</Windows>
<Connectionip="192.168.0.1"timeout="123.456000"/>
</MyApp>
并且在目录下生成一个XML文件如下:
File:out_test.xml |
<?xmlversion="1.0"?> <MyApp> <Messages> <Welcome>WelcometoMyApp</Welcome> <Farewell>ThankyouforusingMyApp</Farewell> </Messages> <Windows> <Windowname="MainFrame"x="5"y="15"w="400"h="250"/> </Windows> <Connectionip="192.168.0.1"timeout="123.456000"/> </MyApp> |