TinyXML解析模块使用方法

openkk 12年前

目录

一、文档简介: 4

二、 TinyXML解析及使用 4

1.解析XML 5

2.构建XML 7

一、文档简介:

本文档用于辅助使用者使用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-2f1B交叉编译工具链)

所需软件及工具包:

TinyXML解析模块源码包:tinyxml.tgz

二、TinyXML解析及使用

TinyXML是个XML解析库,主要由DOM模型类(TiXmlBaseTiXmlNodeTiXmlAttributeTiXmlCommentTiXmlDeclarationTiXmlElementTiXmlTextTiXmlUnknown)和操作类(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.htinystr.htinystr.cpptinyxml.cpptinyxmlerror.cpptinyxmlparser.cpp)导入工程就可以使用了。

一般情况下,我们需要对XML的操作主要有以下几种情况的需求:

1.解析XML内容

2.构建XML内容

3.节点数据查询

4.节点数据删除

5.节点数据修改

6.其他

下边将主要讲述如何使用这些类及其函数接口来解析及构建XML:

1.解析XML

由首先准备一个XML片段,如下文件所示:

Filein_test.xml

<Persons>

        <Person ID="1">

            <name>小明</name>

            <age>20</age>

        </Person>

        <Person ID="2">

            <name>小红</name>

            <age>30</age>

        </Person>

    </Persons>

然后我们编写一段读取节点内容及属性的测试程序如下:

Functionbool 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;

    }

    //获得第一个Personname节点和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;

    //输出第一个Personname内容,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的例子,

Functionbool 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>