程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> C++ XML解析之TinyXML篇

C++ XML解析之TinyXML篇

編輯:更多關於編程

      最近使用TinyXML進行C++ XML解析,感覺使用起來比較簡單,很容易上手,本文給出一個使用TinyXML進行XML解析的簡單例子,很多復雜的應用都可以基於本例子的方法來完成。以後的文章裡會講解使用Xerces進行C++ XML解析的例子,希望大家一起交流。

      TinyXML是一個開源的解析XML的解析庫,能夠用於C++,能夠在Windows或Linux中編譯。這個解析庫的模型通過解析XML文件,然後在內存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹。

      DOM模型即文檔對象模型,是將整個文檔分成多個元素(如書、章、節、段等),並利用樹型結構表示這些元素之間的順序關系以及嵌套包含關系。

      首先從網上下載TinyXML的庫,文件夾的名字是TinyXpath,在工程裡做如下配置:

      在附加包含路徑裡添加:你的tinyxpath路徑/tinyxpath/include

      在附加庫路徑裡添加:你的tinyxpath路徑/tinyxpath/lib

      在對象/庫路徑裡添加:tinyxpathd.lib,如果使用release版本,則是tinyxpath.lib。

      另外,由於我開發的項目是多線程的,所以設置了多線程的環境,因此使用TinyXML沒有出現問題。本人將TinyXML寫在一個單獨的C++工程進行測試,發現如果不設置多線程的環境,會出現鏈接錯誤。我覺得原因可能是TinyXML使用了多線程環境,因此需要設置多線程的環境。在工程/設置下的C/C++選項卡中,選擇Code Generation,在Use run-time library中選擇Debug MultiThreaed DLL即可。

      本例的XML文件Students.xml如下:

      <Class name="計算機軟件班">

      <Students>

      <student name="張三" studentNo="13031001" sex="男" age="22">

      <phone>88208888</phone>

      <address>西安市太白南路二號</address>

      </student>

      <student name="李四" studentNo="13031002" sex="男" age="20">

      <phone>88206666</phone>

      <address>西安市光華路</address>

      </student>

      </Students>

      </Class>

      程序代碼XmlParseExample.cpp如下所示:

      #include <iostream>

      #include <string>

      #include <tinyxml.h>

      using std::string;

      int main()

      {

      TiXmlDocument* myDocument = new TiXmlDocument();

      myDocument->LoadFile("Students.xml");

      TiXmlElement* rootElement = myDocument->RootElement(); //Class

      TiXmlElement* studentsElement = rootElement->FirstChildElement(); //Students

      TiXmlElement* studentElement = studentsElement->FirstChildElement(); //Students

      while ( studentElement ) {

      TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //獲得student的name屬性

      while ( attributeOfStudent ) {

      std::cout 《 attributeOfStudent->Name() 《 " : " 《 attributeOfStudent->Value() 《 std::endl;

      attributeOfStudent = attributeOfStudent->Next();

      }

      TiXmlElement* phoneElement = studentElement->FirstChildElement();//獲得student的phone元素

      std::cout 《 "phone" 《 " : " 《 phoneElement->GetText() 《 std::endl;

      TiXmlElement* addressElement = phoneElement->NextSiblingElement();

      std::cout 《 "address" 《 " : " 《 phoneElement->GetText() 《 std::endl;

      studentElement = studentElement->NextSiblingElement();

      }

      return 0;

      }

      程序運行結果如下:

      name : 張三

      studentNo : 13031001

      sex : 男

      age : 22

      phone : 88208888

      address : 88208888

      name : 李四

      studentNo : 13031002

      sex : 男

      age : 20

      phone : 88206666

      address : 88206666

      本例中使用的是對xml文件進行解析,很容易掌握,但是很多開發人員不知道如何對xml 字符流(非xml文件)進行解析,我看了TinyXML提供的源代碼,裡面可以使用如下方法對xml流解析。對應於上例,代碼如下:

      string xmlString =

      "<Class name="計算機軟件班">

      <Students>

      <student name="張三" studentNo="13031001" sex="男" age="22">

      <phone>88208888</phone>

      <address>西安市太白南路二號</address>

      </student>

      <student name="李四" studentNo="13031002" sex="男" age="20">

      <phone>88206666</phone>

      <address>西安市光華路</address>

      </student>

      </Students>

      </Class>";

      TiXmlDocument* myDocument = new TiXmlDocument();

      myDocument->Parse(xmlString.c_str());

      使用Parse函數就可以解析XML字符流了,這是很多開發者不太熟悉的情況。

      如果開發者開發特定應用,就可以使用上述類似方法,可能不需要完全處理每一個屬性,比如可以對屬性名進行判斷,只處理自己需要的屬性,或者自己需要的xml元素。還可以使用TinyXML的方法創建xml元素和xml屬性,或者設置xml元素和屬性對應的值,等等,如果讀者想要類似的例子,可以留言寫出。

      下面介紹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的一些操作。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved