QT平臺下基于XML的界面設計與管理(下)
接上篇
3 界面的實現與管理
圖1(103頁)所示為基于xml生成界面的大體流程,由 于本文選用pugixml庫進行操作,因此在配置、加載以及修 改界面元素時均使用pugixml庫的基本操作方法,下面詳細 介紹。
3.1 使用pugixml庫配置
本文使用pugixml庫進行參數配置。具體方法如下:首 先對pugixml進行配置,pugixml的三個文件,可以只include 頭文件pugixml.hpp,CPP文件不用放到項目中,方法是, 在pugiconfig.hpp中:#define PUGIXML_HEADER_ONLY和
#include "pugixml.cpp",將這兩行的注釋去掉即可。另外,如 果項目使用的是Unicode設置,則可以在pugicon句g.hpp中:
#define PUGIXML_WCHAR_MODE將wchar模式打開即 可。
對 界 面 進 行 參 數 配 置 , 即 x m l 節 點 讀 取 , 如 x m l 文 件
圖5 修改XML參數配置
params.xml:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!-- 輸入參數配置 -->
<form ip="10.2.134.243" port="80" action="sisserver.php">
<input name="data_type" value="POI" />
<input name="query_type" value="TQUERY" />
<input name="category" value="" />
3.2 使用pugixml庫加載
pugixml提供幾個函數用于從不同地方加載xml數據。 這 些 函 數 使 用 超 快 非 驗 證 的 解 析 器 , 這 個 解 析 器 不 完 全 遵 照W3C標準,它可以加載任何有效的XML文檔,但沒有執 行某些well-formedness檢查。雖然已經很努力來排除無效 的XML文檔,但為了性能的原因有些驗證沒有完全執行。 一些XML轉換(例如: EOL處理或屬性值標準化)將導致解 析 速 度 下 降 , 因 此 不 進 行 這 些 驗 證 。 對 于 絕 大 多 數 X M L 文檔的不同解析選項, 并不存在性能上的差異。 pug i x ml 支 持 當 前 流 行 的 U n i c o d e
編 碼 ( U T F- 8 , U T F- 1 6 ( 大 小 端 ) , U T F - 3 2 ( 大 端 ) , UCS-2也自然支持,因為它 是UTF-16的子集)并自動處 理 所 有 編 碼 轉 換 。 加 載 函
數通過檢查XML數據的頭部分自動進行編碼檢測。
1)從文件加載文檔 多數XML文檔來自文件,pugixml提供專門的函數從文
件加載XML文檔,如下:
xml_parse_result xml_document::load_句le(const char* path,unsigned int options = parse_default, xml_encoding encoding =
encoding_auto);
xml_parse_result xml_document::load_file(const wchar_t*
path, unsigned int options = parse_default, xml_encoding encoding
= encoding_auto);
這些函數接受文件路徑作為第一個參數,包括兩個可 選參數,一個用于指定解析選項,另一個指定輸入數據的編 碼類型。
2)從內存加載
從內存中加載文檔,首先需要為XML數據提供一個連 續的內存塊;然后調用緩沖區加載函數,如果需要,這些函數將處理編碼轉換,然后解析數據為XML文檔樹。
3)從C++ IO流加載
為 了 加 強 交 互 性 , p u g i x m l 提 供 了 從 任 何 實 現 c + + std::istream接口的對象中加載文檔。這允許你從任何c++流 (例如文件流)或任何第三方實現(例如boost Iostream)中加載 文檔。
具體來說,使用pugixml加載文件,方法是:
首先,加載xml文件,使用xml_document類的load_句le接 口:
std::strFile = "../test.xml";
pugi::xml_document doc;
if (!doc.load_句le(strFile.c_str()))
{//return -1;}
其次,加載xml格式的字符串,使用xml_document類的
load接口:
std::strText = "****";
pugi::xml_document doc;
if (!doc.load(strText.c_str()))
{//return -1;}
圖2、3(104頁)為本文所討論QT平臺構建軟件下,對其
XML文件的參數配置,圖4(104頁)為生成的樹形結構界面。
3.3 使用pugixml庫查詢及修改
在XML描述界面信息的基礎上,用XML的查詢技術如 XQuery,XPath等進行模型信息的查詢,可將之前系統開發 獲得的界面信息用XML文件的形式存儲起來,并且可以組 織形成一個界面信息庫。對于界面信息的查詢,可以分別從 名稱、描述信息、XML文檔中定義的元素和屬性等關鍵字 進行查詢,將此查詢到的界面描述信息經過修改和擴展就可以加入到新工程的設計開發
中,從而可以大大提高開發 效率。
1)查詢:pugixml提供
一 些 方 法 用 于 從 文 檔 中 獲 取 不 同 類 型 的 數 據 和 遍 歷 文 檔 。 除 了 X Pat h 相 關 的 函 數,其它方法都沒有修改文 檔 , 。 其 中 有 兩 種 類 型 的 樹 數據句柄, x ml_node和x ml_ attribute;
圖6 修改后生成界面
2)修改:可以通過pugixml提供的函數修改文檔結構或
修改節點、屬性的數據,這些函數負責管理內存和結構的完 整性,因此操作之后總能保持樹結構的有效性。然而,也有 可能創建一個無效的XML樹(例如,添加兩個相同名字的屬 性或設置屬性/節點的名字為無效的字符串)。對于屬性的修 改,內存消耗和性能都是經過優化的,如果你有足夠的內 存從頭開始創建文檔,稍后在保存它們到文件比起手寫xml 文本沒有太大的開銷。所有改變節點/屬性數據或結構的成 員函數都是非const的,因此不能在const類型的句柄上調用 它們。然后你可以輕易地轉換const型句柄到非const型,僅 需要一個賦值操作,例如void foo(const pugi::xml_node& n) { pugi::xml_node nc = n; },因為常量的準確性在這里主要提供 作為參考文檔而已。
圖5、6為將XML參數修改之后的參數配置及其重新生 成的界面,和圖2、3、4進行對比,可以看出,我們 將“設 備1”-“設備5”的名稱變更為“設備更新1”-“設備更新
5”,在界面有新的顯示,以此類推,通過訪問XML文件實 現對界面的管理。
4 結束語
本文討論的QT平臺下利用XML技術進行界面的設計和 管理,主要利用pugixml庫進行XML文件的具體操作,最終 成功生成界面。因此證明,基于XML 的用戶界面管理系統 為軟件開發提供了有效且有力的支持,通過該系統不僅可以 使用戶界面描述信息與功能實現代碼相分離,簡化用戶界面 的開發與維護,提高界面的開發效率,還可以使軟件的最終 用戶獲得與開發人員相同的界面操控能力,在系統運行前和
運行過程中對用戶界面進行配置和管理等操作。
評論