TinyXML解析模块使用方法
目录
一、文档简介:
本文档用于辅助使用者使用TinyXML解析模块进行开发工作。
TinyXML是一个开源的解析XML的解析库,主要作用是解析一个XML文档并由此生成一个可读可修改可保存的文档对象模型(DOM)。 XML的意思是“可扩展标记语言“(eXtensible Markup Language)。它允许你创建你自己的文档标记。TinyXML使用文档对象模型(DOM),DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。这意味着XML数据被解析成一个可被浏览和操作的C++对象,然后它可以被写到磁盘或者另一个输出流中。你也可以把C++对象构造成一个XML文档然后把它写到磁盘或者另一个输出流中。
该解析库可以在http://sourceforge.net/projects/tinyxml/files/下载。
开发环境参数:
操作系统:Ubuntu 11.04
本机平台:X86
目标平台:Loongson 1B 开发板
交叉编译工具链: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> <Person ID="1"> <name>小明</name> <age>20</age> </Person> <Person ID="2"> <name>小红</name> <age>30</age> </Person> </Persons> |
然后我们编写一段读取节点内容及属性的测试程序如下:
Function:bool AnalysXML(const char *xml_file) //读取第一个节点的属性及内容 |
bool AnalysXML(const char *xml_file) { //创建一个XML的文档对象。 TiXmlDocument *document = new TiXmlDocument(xml_file); //"传入XML文件名" if (NULL == document) { return false; } document->LoadFile(); //获得根元素。 TiXmlElement *root_element = document->RootElement(); if (NULL == root_element) { return false; } //获得第一个Person节点。 TiXmlElement *first_element = root_element->FirstChildElement(); if (NULL == first_element) { return false; } //获得第一个Person的name节点和age节点和ID属性。 TiXmlElement *name_element = first_element->FirstChildElement(); if (NULL == name_element) { return false; } TiXmlElement *age_element = name_element->NextSiblingElement(); if (NULL == age_element) { return false; } TiXmlAttribute *id_attribute = first_element->FirstAttribute(); if (NULL == id_attribute) { return false; } //输出XML内容到控制台 cout << "Analys XML:" << endl; document->Print(stdout); //输出根元素名称,即输出Persons。 cout << "The first element: " << root_element->Value() << endl; //输出第一个Person的name内容,age内容,ID属性。 cout << "The first child element: " << name_element->FirstChild()->Value() << endl; cout << "The second child element: " << age_element->FirstChild()->Value() << endl; cout << "The first child element's attribute: " << id_attribute->Value() << endl; return true; } |
编译后执行可以看到控制台有如下输出:
# ./xml_test
Analys XML:
<Persons>
<Person ID="1">
<name>小明</name>
<age>20</age>
</Person>
<Person ID="2">
<name>小红</name>
<age>30</age>
</Person>
</Persons>
The first element: Persons
The first child element: 小明
The second child element: 20
The first child element's attribute: 1
2.构建XML
下边是构建XML的例子,
Function:bool CreateXML(const char *xml_file) //构建XML内容并保存到文件 |
bool CreateXML(const char *xml_file) { // 定义一个TiXmlDocument类指针 TiXmlDocument *document = new TiXmlDocument; if (NULL == document) { return false; } // 定义一个xml文件头部声明 TiXmlDeclaration *declaration = new TiXmlDeclaration(("1.0"),(""),("")); if (NULL == declaration) { return false; } document->LinkEndChild(declaration); // 生成一个根节点:MyApp TiXmlElement *first_element = new TiXmlElement(("MyApp")); if (NULL == first_element) { return false; } document->LinkEndChild(first_element); // 生成子节点:Messages TiXmlElement *child_element_messages = new TiXmlElement(("Messages")); if (NULL == child_element_messages) { return false; } first_element->LinkEndChild(child_element_messages); // 生成子节点:Welcome TiXmlElement *child_element_welcome = new TiXmlElement(("Welcome")); if (NULL == child_element_welcome) { return false; } child_element_messages->LinkEndChild(child_element_welcome); // 设置Welcome节点的值 const char* str_value = ("Welcome to MyApp"); TiXmlText *welcome_value = new TiXmlText(str_value); child_element_welcome->LinkEndChild(welcome_value); // 生成子节点:Farewell TiXmlElement *child_element_farewell = new TiXmlElement(("Farewell")); if (NULL == child_element_farewell) { return false; } child_element_messages->LinkEndChild(child_element_farewell); // 设置Farewell节点的值 str_value = ("Thank you for using MyApp"); TiXmlText *farewell_value = new TiXmlText(str_value); child_element_farewell->LinkEndChild(farewell_value); // 生成子节点:Windows TiXmlElement *child_element_windows = new TiXmlElement(("Windows")); if (NULL == child_element_windows) { return false; } first_element->LinkEndChild(child_element_windows); // 生成子节点:Window TiXmlElement *child_element_window = new TiXmlElement(("Window")); if (NULL == child_element_window) { return false; } 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 = new TiXmlElement(("Connection")); if (NULL == child_element_connection) { return false; } 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 << "Creat XML:" << endl; document->Print(stdout); return true; } |
编译后执行可以看到控制台有如下输出:
# ./xml_test
Creat XML:
<?xml version="1.0" ?> <MyApp> <Messages> <Welcome>Welcome to MyApp</Welcome> <Farewell>Thank you for using MyApp</Farewell> </Messages> <Windows> <Window name="MainFrame" x="5" y="15" w="400" h="250" /> </Windows> <Connection ip="192.168.0.1" timeout="123.456000" /> </MyApp>
并且在目录下生成一个XML文件如下:
<?xml version="1.0" ?> <MyApp> <Messages> <Welcome>Welcome to MyApp</Welcome> <Farewell>Thank you for using MyApp</Farewell> </Messages> <Windows> <Window name="MainFrame" x="5" y="15" w="400" h="250" /> </Windows> <Connection ip="192.168.0.1" timeout="123.456000" /> </MyApp>