測試程式在設計通用library的時候,一般會採用xml作為configuration file。利用xml的樹形結構的優勢,可以提供複雜的輸入引數,test library讀入xml的這些leaf資料後,生成測試的sequence實現測試需求。其優勢如下:

xml本身的樹形結構適合定義任意個數,任意層級巢狀的複雜引數輸入(csv一般只能定義某一層和固定數目的引數);

xml本身有XSD schema可以很好的定義樹形結構,以及各個枝葉的資料型別,出現次數等約束。輸入的xml可以先和預定義的xsd進行形式化驗證,保證輸入的有效性,避免test library太多的xml本身合法性的檢查

https://www。

w3school。com。cn/schema/

index。asp

test library設計的通用性,可擴充套件性以及移植性好,可以方便的使用在不同產品中

C++有很多庫可以解析xml檔案,一般tinyxml比較常用。但是採用該實現方式的缺點如下:

tinyxml是直接讀取xml的,一般要求leaf資料是string型別,需要在code根據不同欄位轉換為合適的資料型別(比如double,int。。。etc)

一般xsd定義的樹形結構很複雜,但是每個xml可能只包含樹形的一部分(其他是optional),那麼根據少數xml寫的code很大可能無法處理所有的該型別xml,驗證的工作很重;

更合理的實現方式如下:

根據測試需求定義xsd檔案,保證樹形定義的完備性

xsd檔案一般分為以下幾個部分:

- leaf的資料型別定義,這些資料型別會被下面的leaf reference

C++如何解析XML

- element的樹狀結構定義,下圖可以清楚的看到從root開始,一級一級如何伸展的,以及每一個枝葉的出現次數和資料型別;

C++如何解析XML

使用code synthesis提供的xsd工具,將xsd轉為C++的*。hpp和 *。cpp

具體命令如下,將xsd轉為cxx-tree的*。hpp和 *。cpp。注意因為使用了option ——root-element-first, xsd的第一個element必須是root,否則轉出來的檔案有問題

xsd cxx-tree ——hxx-suffix 。hpp ——cxx-suffix 。cpp -output-dir ——show-sloc ——generate-doxygan ——root-element-first ——function-naming lcc ——type-name ucc ——proprietary-license ——generate-polymorphic ——polymorphic-type-all

將轉出的*。hpp和 *。cpp拷到test library,該c++ code已經將xsd樹形結構轉化為class;

C++如何解析XML

編寫讀取xml的code

xsd生成的*。hpp作為include,定義method讀取xml檔案,已經定義private methods去解析樹形結構的每一類枝葉。

C++如何解析XML

讀取xml的code非常簡單, 用root讀取xml檔案,然後用iteration去逐級訪問每個枝葉

C++如何解析XML

如果某個枝是optional的,那麼需要先用present()檢查是否存在,然後再訪問該枝get()

C++如何解析XML

C++如何解析XML

總之採用該實現方式可以保證xml解析的完備性,而且不需要考慮資料型別轉換,因為每個leaf的資料型別已經被class定義好了,只需要直接使用就好了。

希望本文可以幫助有xml解析需求的工程師,正確的使用xsd可以保證code的質量。