最近研究XML比較多,剛剛研究了MSXML,現在再來看看一個比較簡單的解析器-CMarkup。以下均是本人從網上搜集的,然後整理到了一起,這應該不算侵權吧,哈哈!
閒話結束,轉入正題:
Cmarkup是基於“壓縮”文檔對象模型(EDOM:"Encapsulated" Document Object Model),這是這個簡單XML處理器的關鍵。它的一套XML處理方法和產生的效果與DOM(Document Object Model)是一樣的。但是整個DOM有無數的對象類型,而EDOM只定義了一個對象:XML文檔,EDOM回到了XML原始的吸引力—簡單。關於方法的完整文檔,請看EDOM Specification。
CmarkUp封裝了XML文檔文本、結構和當前位置。它提供了增加元素、導航和得到元素屬性和數據的所有方法。在文檔中操作被執行的地方取決於當前位置和當前孩子位置。當前位置允許你增加一個元素到文檔中的這個位置,而不需要明確指出增加對象到文檔的這點上,在CMarkup的有效生命週期裏,對象一直保持着一個用來描述文檔的字符串,當你調用GetDoc()可以得到它。
1. 創建一個XML文檔
對於創建一個XML文檔,需要實例化一個CMarkup對象,並調用AddElem創建根元素。在這個位置,如果你調用 AddElem("ORDER"),你的文檔會簡單的裝一個空ORDER元素<ORDER/>,然後調用AddChildElem在根元素的下面創建元素 (例如:“進入”根元素內部,層次表示)。下面的示例代碼創建一個XML文檔並返回它(的內容)到一個字符串中。
這些代碼產生了下面的XML,這個根結點是ORDER元素;注意它的開始標籤<ORDER> 在開頭,結束標籤</ORDER>在結尾。當一個元素是在一個父下面(深入或被包含),這個父元素的開始標籤要在它之前,結束標籤要在它之後。ORDER元素包含一個ITEM元素,而ITEM元素包含了三個字子元素:SN、NAME和QTY;
<ORDER>
<ITEM>
<SN>132487A-J</SN>
<NAME>crank casing</NAME>
<QTY>1</QTY>
</ITEM>
</ORDER>
如例子中所顯示的,你也能夠在一個子元素下創建新元素,這需要調用IntoElem 移動你的當前主位置到當前子元素位置,然後你就可以在這下面增加一個子元素了。CMarkup在索引中保持了一個當前位置指針,以保證你的源碼更加短和更簡單,當導航文件時,相同的邏輯位置也會被使用。
2. 導航XML文檔
上面的例子所創建的XML字符串,用SetDoc方法加入到CMarkup對象中能夠被解析,你也可以引導它正確的進入被創建的同一個CMarkup對象中,如果你要設置當前位置到文檔的開始時,需要調用ResetPos.
在下面的例子中,從csXML字符串生成CMarkup對象後,我們循環ORDER元素下的所有ITEM元素,並得到每個項目的序號和數量。
對於我們發現的每個元素,在查詢它了子元素之前要調用IntoElem,查詢完之後再調用OutOfElem ,當你習慣於這種導航類型時,你將知道,檢查你的循環時,要確定每個IntoElem 調用都有一個與之對應的OutOfElem 調用 。
3. 增加元素和屬性
上面創建文檔的例子中僅創建了一個ITEM元素,現在這個例子是創建多個項目,從前一個內容加裁後,再增加數據源,加上SHIPMENT信息元素中有一個屬性,這段代碼也演示了你能調用調用IntoElem和AddElem來代替AddChildElem,函數調用。雖然這意味着更多的調用,但許多人認爲這樣更直觀。
這段代碼產生了下面的XML,根元素ORDER包含兩個ITEM元素和一個SHIPMENT元素,ITEM元素全都包含SN、NAME、和QTY元素,SHIPMENT元素包含一個帶有屬性類型的POC元素,和NAME及TEL子元素。
<ORDER>
<ITEM>
<SN>132487A-J</SN>
<NAME>crank casing</NAME>
<QTY>1</QTY>
</ITEM>
<ITEM>
<SN>4238764-A</SN>
<NAME>bearing</NAME>
<QTY>15</QTY>
</ITEM>
<SHIPMENT>
<POC type="non-emergency">
<NAME>John Smith</NAME>
<TEL>555-1234</TEL>
</POC>
</SHIPMENT>
</ORDER>