TinyXML解析模塊使用方法

openkk 12年前發布 | 55K 次閱讀 TinyXML XML操作類庫

目錄

一、文檔簡介: 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

</td> </tr>

<Persons>

        <Person ID="1">

            <name>小明</name>

            <age>20</age>

        </Person>

        <Person ID="2">

            <name>小紅</name>

            <age>30</age>

        </Person>

    </Persons>

</td> </tr> </tbody> </table>

然后我們編寫一段讀取節點內容及屬性的測試程序如下:

  • Functionbool AnalysXML(const char *xml_file) //讀取第一個節點的屬性及內容

    </td> </tr>

    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;

    }

    </td> </tr> </tbody> </table>

    編譯后執行可以看到控制臺有如下輸出:

    # ./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內容并保存到文件

    </td> </tr>

    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;

    }

    </td> </tr> </tbody> </table>

    編譯后執行可以看到控制臺有如下輸出:

    # ./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></pre>

    并且在目錄下生成一個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></pre>

     本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
     轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
     本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
  • sesese色