歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++請求Web Service與XML解析

1. C++解析XML的開源庫

在項目中XML的解析使用的是開源的第三方庫,TinyXML;這個解析庫的模型通過XML文件,然後再內存中生成DOM模型,從而讓我們可以很方便的遍歷這顆XML樹。

DOM模型即文檔對象模型,是將整個文檔分成多個元素(如:書、章、節、段等),並利用樹型結構表示這些元素之間的順序關系以及嵌套包含關系。先看一下TinyXML中的主要類和XML文檔之間的對應關系,下圖是TinyXML中主要class的類圖,反應各個類之間的靜態關系。

C++ 設計新思維》 下載見 http://www.linuxidc.com/Linux/2014-07/104850.htm

C++ Primer Plus 第6版 中文版 清晰有書簽PDF+源代碼 http://www.linuxidc.com/Linux/2014-05/101227.htm

讀C++ Primer 之構造函數陷阱 http://www.linuxidc.com/Linux/2011-08/40176.htm

讀C++ Primer 之智能指針 http://www.linuxidc.com/Linux/2011-08/40177.htm

讀C++ Primer 之句柄類 http://www.linuxidc.com/Linux/2011-08/40175.htm

將C語言梳理一下,分布在以下10個章節中:

  1. Linux-C成長之路(一):Linux下C編程概要 http://www.linuxidc.com/Linux/2014-05/101242.htm
  2. Linux-C成長之路(二):基本數據類型 http://www.linuxidc.com/Linux/2014-05/101242p2.htm
  3. Linux-C成長之路(三):基本IO函數操作 http://www.linuxidc.com/Linux/2014-05/101242p3.htm
  4. Linux-C成長之路(四):運算符 http://www.linuxidc.com/Linux/2014-05/101242p4.htm
  5. Linux-C成長之路(五):控制流 http://www.linuxidc.com/Linux/2014-05/101242p5.htm
  6. Linux-C成長之路(六):函數要義 http://www.linuxidc.com/Linux/2014-05/101242p6.htm
  7. Linux-C成長之路(七):數組與指針 http://www.linuxidc.com/Linux/2014-05/101242p7.htm
  8. Linux-C成長之路(八):存儲類,動態內存 http://www.linuxidc.com/Linux/2014-05/101242p8.htm
  9. Linux-C成長之路(九):復合數據類型 http://www.linuxidc.com/Linux/2014-05/101242p9.htm
  10. Linux-C成長之路(十):其他高級議題

TiXmlBase是所有類的基類,TiXmlNode、TiXmlAttribute兩個類都繼承自TiXMLBase類,其中TiXmlNode類指的是所有被<...>...<.../>包括的內容,而xml中的節點又具體分為以下幾方面內容,分別是聲明、注釋、節點以及節點間的文本,因此在TiXmlNode基礎上又衍生出來這幾個類TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分別用來指明具體是xml中的哪一部分。TiXmlAttribute類不同於TiXmlNode,它指的是在尖括號裡面的內容,像<...***=...>,其中***就是一個屬性,這裡采用一個XML文檔具體說明一下:

1.<?xml version="1.0" encoding="UTF-8"?> 
2.<phonebook> 
3.    <!--one item behalfs one contacted person.--> 
4.    <item> 
5.        <name>miaomaio</name> 
6.    <addr>Shaanxi Xi'an</addr> 
7.    <tel>13759911917</tel> 
8.    <email>[email protected]</email> 
9.    </item> 
10.    <item> 
11.        <name>gougou</name> 
12.    <addr>Liaoning Shenyang</addr> 
13.    <tel>15840330481</tel> 
14.    <email>[email protected]</email> 
15.    </item> 
16.    <!--more contacted persons.--> 
16.  </phonebook> 

  • 像TiXmlDeclaration指的就是,
  • 像TiXmlComment指的就是、,
  • 像TiXmlDocument指的就是整個xml文檔,
  • 像TiXmlElement指的就是
  • 、、、等等這些節點,
  • 像TiXmlText指的就是‘gougou’、‘15840330481’這些夾在與、與、與之間的文本文字,
  • 像TiXmlAttribute指的就是節點中version、encoding,
  • 除此之外就是TiXmlUnknown。

1) 讀取XML文件

//!xml文件讀取,模擬調用接口返回char *字符串
 filebuf *pbuf;
 ifstream filestr;
 long size;
 char *buffer;

 filestr.open(XML_EXAMPLE_FILE_NAME, ios::binary);
 pbuf = filestr.rdbuf();
 size = pbuf->pubseekoff(0,ios::end,ios::in);
 pbuf->pubseekpos(0, ios::in);

 buffer = new char[size];
 pbuf->sgetn(buffer, size);
 filestr.close();

 //!從xml字符串中獲取相關值
 string strCreationTime;
 string strJobId;
 string strJobType;
 string strJobName;
 string strJobLeader;

 TiXmlDocument *xmlDocument = new TiXmlDocument();
 xmlDocument->Parse(buffer, 0, TIXML_DEFAULT_ENCODING);

 TiXmlElement *RootElement = xmlDocument->RootElement();
 TiXmlElement *fileHeaderElement = RootElement->FirstChildElement();
 TiXmlElement *fileBodyElement = fileHeaderElement->NextSiblingElement();

 for (TiXmlElement *nodeElement = fileHeaderElement->FirstChildElement(); nodeElement; nodeElement = nodeElement->NextSiblingElement())
 {
  string strElementKey = nodeElement->Value();
  if (strElementKey.compare(XML_PARSE_CREATION_TIME) == 0)
  {
   strCreationTime = nodeElement->GetText();
  }
 }

 for (TiXmlElement *nodeElement = fileBodyElement->FirstChildElement(); nodeElement; nodeElement = nodeElement->NextSiblingElement())
 {
  string strElementKey = nodeElement->Value();
  if (strElementKey.compare(XML_PARSE_JOB_ID) == 0)
  {
   strJobId = nodeElement->GetText();
  }

  if (strElementKey.compare(XML_PARSE_JOB_TYPE) == 0)
  {
   strJobType = nodeElement->GetText();
  }

  if (strElementKey.compare(XML_PARSE_JOB_NAME) == 0)
  {
   strJobName = nodeElement->GetText();
  }

  if (strElementKey.compare(XML_PARSE_JOB_LEADER) == 0)
  {
   strJobLeader = nodeElement->GetText();
  }
 }

2) 創建、生成XML文件
以如下XML文件為例:

<?xml version=”1.0” encoding=”gb2312”>
<InterFaceFile>
    <FileHeader>
          <MessageType>ProxyMiddleWareJobSearch</MessageType>
          <Originator>WetLand</Originator>
    <Recipient>Platform</Recipient>
          <CreationTime>2014-9-18 10:25:20</CreationTime>
    </FileHeader>
    <FileBody>
          <UserName>...</UserName>
          <UserRoleID>13</UserRoleID>
          <JobType></JobType>
    </FileBody>
</InterFaceFile>

 

//! 構建XML字符串
 TiXmlDocument *pDoc = new TiXmlDocument;
 TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0", "gb2312", "");
 pDoc->LinkEndChild(pDeclaration);

 TiXmlElement *pEleRoot = new TiXmlElement("InterFaceFile");
 pDoc->LinkEndChild(pEleRoot);

 TiXmlElement *pEleFileHeader = new TiXmlElement("FileHeader");
 TiXmlElement *pEleFileBody = new TiXmlElement("FileBody");
 pEleRoot->LinkEndChild(pEleFileHeader);
 pEleRoot->LinkEndChild(pEleFileBody);

 TiXmlElement *pEleMessageType = new TiXmlElement("MessageType");
 TiXmlElement *pEleOriginator = new TiXmlElement("Originator");
 TiXmlElement *pEleRecipient = new TiXmlElement("Recipient");
 TiXmlElement *pEleCreationTime = new TiXmlElement("CreationTime");
 pEleFileHeader->LinkEndChild(pEleMessageType);
 pEleFileHeader->LinkEndChild(pEleOriginator);
 pEleFileHeader->LinkEndChild(pEleRecipient);
 pEleFileHeader->LinkEndChild(pEleCreationTime);

 TiXmlText *pEleMessageTypeText = new TiXmlText("ProxyMiddleWareJobSearch");
 TiXmlText *pEleOriginatorText = new TiXmlText("WetLand");
 TiXmlText *pEleRecipientText = new TiXmlText("Platform");
 TiXmlText *pEleCreationTimeText = new TiXmlText("2014-9-18 10:25:20");

 pEleMessageType->LinkEndChild(pEleMessageTypeText);
 pEleOriginator->LinkEndChild(pEleOriginatorText);
 pEleRecipient->LinkEndChild(pEleRecipientText);
 pEleCreationTime->LinkEndChild(pEleCreationTimeText);

 //!
 TiXmlElement *pEleUserName = new TiXmlElement("UserName");
 TiXmlElement *pEleUserRoleID = new TiXmlElement("UserRoleID");
 TiXmlElement *pEleJobType = new TiXmlElement("JobType");
 pEleFileBody->LinkEndChild(pEleUserName);
 pEleFileBody->LinkEndChild(pEleUserRoleID);
 pEleFileBody->LinkEndChild(pEleJobType);

 TiXmlText *pEleUserNameText = new TiXmlText("...");
 TiXmlText *pEleUserRoleIDText = new TiXmlText("13");
 TiXmlText *pEleJobTypeText = new TiXmlText("");

 pEleUserName->LinkEndChild(pEleUserNameText);
 pEleUserRoleID->LinkEndChild(pEleUserRoleIDText);
 pEleJobType->LinkEndChild(pEleJobTypeText);

 pDoc->SaveFile("E:/houqd.xml");

3) 生成XML字符串
生成XML字符串只需要將如上的pDoc->SaveFile(“E:/houqd.xml”)替換為如下:

//!生成string字符串
 TiXmlPrinter printer;
 pDoc->Accept(&printer);

 string strRequest(printer.CStr()); 

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-02/112880p2.htm

Copyright © Linux教程網 All Rights Reserved