容器‎ > ‎

cxxlXmlComposite

提供 XML 規格架構的容器,並可匯出匯入 XML 文件,編碼採用 C++ 的 wchar_t ,對於不同的編碼並不提供轉換和辨識,須由程式設計師自行處理。

XML 容器和 XML 文件在匯出匯入時會自動對保留字和禁止字元做轉換,若 XML 文件是自行編寫,須將以下這些字元改為相應的編碼:

< > & ' " (空白)
&lt; &gt; &amp; &apos; &quote; &#95;
'\r' '\n' '\t' = / ?
&#13; &#10; &#09; &#61; &#47; &#63;
  • / 和 ? 只須在標籤名或屬性名做轉換
  • " 和 ' 只須在屬性值會被誤認為引號時做轉換
  • (空的字元) '\t' '\r' '\n' 被 XML 用做分隔字元,以及文件編排都會用到,若 XML 資料有用到這些都須做轉換

XML 容器是一種樹狀結構,技節點使用 cxxlXml_Node 這個類別,葉節點使用 cxxlXml_Content 這個類別,兩者都繼承自 cxxlXmlComposite 這個類別

cxxlXmlComposite

class cxxlXmlComposite 是一個虛擬類別,提供存放 XML 規格中的標籤名稱和屬性部份

SetAttr(const UNICODE_String &Value, const UNICODE_String &Name) 設定屬性值,名稱不能為留空
GetAttr(const UNICODE_String &Name) 取得屬性值,若不存在回覆空物件,可用 Smart_Ptr::isNULL() 檢查
GetAttrList() 取得所有屬性列表
   
GetName() 取得這個節點的名稱
ConvertToNode() 轉形為 cxxlXml_Node,若不是 cxxlXml_Node 回覆 NULL
ConvertToContent() 轉形為 cxxlXml_Conten,若不是 cxxlXml_Conten 回覆 NULL

 

cxxlXml_Node

這個主要是提供節點的操作功能,第一個節點(根節點)須由建構函數開始,cxxlXml_Node 建構時可以指定一個名稱,若不指定內定為 L"root"

GetParent() 取得父節點
GetSubnodes() 取得所有子節點列表
   
AddNode(const UNICODE_String &Name) 增加一個子技節點,名稱不能空
AddPrevNode(const UNICODE_String &Name, const Smart_Ptr<cxxlXmlComposite> &Node) 在其子節點 Node 之前增加一個子技節點,名稱不能空
AddNextNode(const UNICODE_String &Name, const Smart_Ptr<cxxlXmlComposite> &Node) 在其子節點 Node 之前增加一個子技節點,名稱不能空
   
AddContent(const UNICODE_String &Name) 增加一個子葉節點,名稱不能空
AddPrevContent(const UNICODE_String &Name, const Smart_Ptr<cxxlXmlComposite> &Node) 在其子節點 Node 之前增加一個子葉節點,名稱不能空
AddNextContent(const UNICODE_String &Name, const Smart_Ptr<cxxlXmlComposite> &Node) 在其子節點 Node 之前增加一個子葉節點,名稱不能空

 

cxxlXml_Content

這個功能只是用來存放一個 Content 文字內容

SetContent(const UNICODE_String &Content) 設定內容文字
GetContent() 取得內容文字

◎另外也可以經由 cxxlXml_Node 和 cxxlXml_Content 使用 cxxlXmlComposite 提供的功能

 

匯出和匯入的函數宣告如下:

// 將 XML_Node 匯出到 XmlStr
void cxxlFASTCALL ExportXML(std::wostream &XmlStr, 
const Smart_Ptr<cxxlXml_Node> &XML_Node);
// 由 XmlStr 匯入建立 XML 容器傳回
// 若失敗傳回 NULL
// spirit 是建立 XML 容器用的
Smart_Ptr<cxxlXml_Node> cxxlFASTCALL ImportXML(std::wistream &XmlStr, 
ISpirit *spirit = Spirit_Easy);

 

範例一

#include <sstream>
#include <iostream>
#include <locale>
#include <CXXLXMLCOMPOSITE.HPP>

using namespace std;
using namespace CxxlMan;
int main(int argc, char* argv[])
{
  setlocale(LC_CTYPE, "");       // 指定系統現正使用中的地區語言做轉換
  Smart_Ptr<cxxlXml_Node> Node_Ptr(new cxxlXml_Node(L"根節點"));
    Smart_Ptr<cxxlXml_Content> Content_Ptr = Node_Ptr->AddContent(L"1.1");
    Content_Ptr->SetContent(L"內容 1.1");
    Node_Ptr = Node_Ptr->AddNode(L"1.2"); // 子節點
    Node_Ptr->SetAttr(L"123", "屬性一");
      Content_Ptr = Node_Ptr->AddContent(L""); // 無名內容
      Content_Ptr->SetContent(L"無名內容 1.2.1");
      Content_Ptr = Node_Ptr->AddContent(L"1.2.2");
      Content_Ptr->SetContent(L"內容 1.2.2");
    Node_Ptr = Node_Ptr->GetParent(); // 回父節點
    Node_Ptr = Node_Ptr->AddNode(L"1.2"); // 技節點名稱可重複
      Content_Ptr = Node_Ptr->AddContent(L"1.2.1");
      Content_Ptr->SetContent(L"內容 1.2.1");
      Content_Ptr = Node_Ptr->AddContent(L"1.2.1"); // 葉節點名稱可重複
      Content_Ptr->SetContent(L"名稱重複 內容 1.2.1");
    Node_Ptr = Node_Ptr->GetParent();
    Node_Ptr = Node_Ptr->AddNode(L" 前有一個空格 1.3");
      Content_Ptr = Node_Ptr->AddContent(L"1.3.1");
      Content_Ptr->SetContent(L"  前有兩空格 ?<含禁用字元>/ ");
    Node_Ptr = Node_Ptr->GetParent();
    Node_Ptr = Node_Ptr->AddNode(L"無內容的節點");
    Node_Ptr->SetAttr(L"123", "屬性一");
    Node_Ptr->SetAttr(L"456", "屬性二");
    Node_Ptr = Node_Ptr->GetParent();
 
  // 匯出成 XML 文件
  wostringstream wosXML;
  ExportXML(wosXML,Node_Ptr);
  wcout << wosXML.str() << endl;
  // 測試由 XML 文件建立 XML 容器
  wistringstream wisXML(wosXML.str());
  Node_Ptr = ImportXML(wisXML);
  // 檢視看看
  wostringstream wosXML2;
  ExportXML(wosXML2, Node_Ptr); 
  wcout << wosXML2.str() << endl;

  return 0; 
}

執行結果:

 
 

引入檔

CXXLXMLCOMPOSITE.HPP

 

程式庫

cxxlcontainer

 
 
 
 
 
 
 
 
 
 
 
 
 
 
Comments