delphi中的XML解析控件TXMLDocument的用法


Delphi中TXMLDocument控件的用法


Delphi中對XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,現稱述於下面。

在講之前先給出一個XML實例,在講某些部分是要結合實例比較容易理解。

1<?xmlversion="1.0"encoding="gb2312"?><!--文檔版本信息,注釋格式同HTML-->

2<XMLPackage>

3<clinetinfoip=”202.101.100.90”handler=”si”unit=”江蘇網商軟件”/>

4<data>

5<rowid=”1”COLOR:red;FONT-FAMILY:宋體;mso-ascii-font-family:'TimesNewRoman';mso-hansi-font-family:'TimesNewRoman'">太陽"sex=”男”age="24"duty="軟件工程師"/>


6<rowid=”2”COLOR:red;FONT-FAMILY:宋體;mso-ascii-font-family:'TimesNewRoman';mso-hansi-font-family:'TimesNewRoman'">月亮"sex=”女”age="25"duty="部門經理"/>

7<!--data中包含了元素row的兩個實例,通過屬性id予以區分-->

8</data>


9<memolength=”16”color=”$0034494B”>Hello!Iamyaya!</memo><!--這個元素中間包含的內容成為Text,而且也含有兩個屬性length,color,當然也可以沒有屬性-->

10<Actionsacition=”update/insert”/><!—該元素描述了一動作控制信息-->

11</XMLPackage>

TXMLDocument控件提供了我們兩種常用做法:一、直接用這個類封裝的屬性和方法來讀寫XML文件,我把它稱為自己解析法;二、用控件提供的XMLDataBindingWizard來創建一個適合用戶自己的接口單元,然后按照這個接口單元提供的許多接口來實現對同類XML文件的讀寫,十分方便,但有局限性,我把它稱為控件解析法。我重點講第一種使用方法。

一、自己解析法:


下面我將按創建、讀取、修改、添加和刪除這五個動作來分三類講述。


(1)創建和添加:


首先要創建XML實例,可以這樣動態創建:


TXMLDocument.Create(‘F:Work費亞的文件askXMLlab_xmlcountry.xml’);


也可以這樣動態創建:


Xml:=TXMLDocument.Create(nil);


Xml.LoadFromFile(‘F:Work費亞的文件askXMLlab_xmlcountry.xml’);


當然也可以從Internet面板上拖放一個TXMLDocument控件,然后再為FileName或XML屬性賦值,比如對象名仍然叫xml(下都不說明都這樣默認):


Xml.FileName:=F:Work費亞的文件askXMLlab_xmlcountry.xml;


至於它的另一個屬性XML是用來直接賦XML語言,這個用法對我們暫不重要。創建完XML實例后要注意打開Active屬性:


Xml.active:=true;


這樣下面對文件的讀寫操作才有效。如果沒有XML文件可以用來創建XML的實例,即要建立XML文件,可以選擇在上面一句之后,對XML實例操作,操作完畢之后加上:


Xml.SaveToFile(‘F:Work費亞的文件askXMLlab_xmlcountry.xml’);


下面就是創建節點了,需要結合上面的XML文件實例來講述。首先一個XML文件只能有一個根節點,比如文件實例中2行的XMLPackage是這樣被創建的:

Varrootnode:XMLNode;


Rootnode:=xml.CreateNode(‘XMLPackage’);


Xml.DocumentElement:=rootnode;


接着我們創建不同類型的子節點,前面的實例中的第9行的節點比較有代表性,它是一個帶有文本的子節點,同時又帶有兩個屬性節點,我們來看看它是怎么被創建的,首先創建一個根節點:


xml.Active:=true;


xml.DocumentElement:=xml.CreateNode('XMLPacage');


接着我們創建memo子節點:


Varnode:IXMLNode;


node:=xml.CreateNode('memo');


xml.DocumentElement.ChildNodes.Add(node);


這種創建兒子節點的方法比較好,當然還可以:


xml.DocumentElement.AddChild('XMLPacage');


來創建,建議使用第一種,CreateNode方法的用法是很豐富的,主要看它的第二個參數,上面其實是用了默認參數,下面我再看看怎樣創建這個子節點的文本的:


node.ChildNodes.Add(xml.CreateNode('Hello!Iamyaya!',ntText));


注意CreateNode方法的第二個參數,我們繼續看屬性是怎么創建的:


node.AttributeNodes.Add(xml.CreateNode('length',ntAttribute));


node.SetAttribute('length',16);


node.AttributeNodes.Add(xml.CreateNode('color',ntAttribute));


node.SetAttribute('color',$0034494B);


最后別忘了保存哦:


xml.SaveToFile('F:Work費亞的文件askXMLlab_xmlest.xml');


xml.Active:=false;


到此我們就結束了創建,至於添加,即插入節點,要插在指定節點后將上面的add(constNode:IXMLNode)方法換成Insert(Index:Integer;constNode:IXMLNode),其它用法也就一目了然,不再詳述了。


(2)讀取和修改


讀取比較簡單,主要是讀取子節點的文本和屬性值,方法是比較簡單,關鍵就是要利用IXMLNodeList接口來提供的一些屬性和方法來循環搜索到指定節點就OK了。文本和屬性值的讀取方法在delphi中提供的方法有很多,我就講一種:NodeValue屬性,它是IXMLNode接口的一個屬性,它的值是OleVariant類型,意味着我們在XML文件里雖然都是存的字符串,但delphi會幫我們來轉換數據格式,比如有個屬性節點叫node:


Node.NodeValue:=16;//16是integer類型


雖然在XML文件中保存的是ASCII格式的16,但當我們要讀取的時候delphi還會幫我們換回來的,只要這樣就可以了:


Varlen:integer;


Len:=node.NodeValue;


當然我們要注意的就是,用這種方法讀取的時候最好先查看同一節點的NodeType屬性,因為有幾種類型的節點避免發生異常,對照如下:


NodeType


NodeValue


ntAttribute屬性節點


屬性的值


ntElement元素節點


如果這個節點沒有子節點,就返回它的TEXT,否則有異常


ntText文本節點


TEXT的內容


上面講的都是讀和寫節點的值,有時候也要讀和寫節點名,就要訪問NodeName屬性,使用方法大概相同,也要結合NodeValue來使用:


NodeType


NodeName


ntAttribute屬性節點


屬性的名字


ntElement元素節點


節點的名字


ntText文本節點


‘#text’


讀取就完了,當然我們上面是通過接口的屬性來做的,接口也有方法來完成,就不說了,對上面的幾個屬性都是可讀可寫的,所以修改也基本清楚了。


(3)刪除


刪除主要給出了刪除指定節點,主要是看IXMLNodeList接口的幾個方法,Clear和Delete方法,其中前一個是全部清空,后一個是刪除指定的子節點,這個方法是重載的,可以按名字也可以按順序號,即Count屬性,非常方便!

 


二、控件解析法:


為控件的FileName屬性選擇一個XML樣板文件,然后由擊控件選擇XMLDataBindingWizard…,在這個向導中間會創建一個xdb文件。在彈出的向導中,第一頁中,可以看到Delphi已經幫你把XML文件中的各個節點對應到了接口,這里你可以展開每個節點,編輯每個節點的屬性數據類型。單擊Next到下一個配置頁面,這里你可以看到Delphi生成了各個節點接口的框架代碼。單擊Finsh完成向導,這樣Delphi將生成一個xdb文件和與該XML文檔結構對應的XML接口單元。再以后訪問該類XML文件時,只需要參照生成的XML接口單元里的方法和屬性就能很方便的讀取節點:

varxml:IXMLXMLPackageType;//通過向導生成的根接口

begin

xml:=LoadXMLPacage(''F:Work費亞的文件askXMLlab_xmlest.xml');//這個方法也是生成的接口單元中的。

xml.Data.Row[1].name;//比如我要取得data下的第2個


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM