Delphi中對XML文件的解析做的很好,比直接使用MS的MSXML2_TLB中的接口要方便很多,現稱述於下面。
在講之前先給出一個XML實例,在講某些部分是要結合實例比較容易理解。
1<?XML version="1.0" encoding="gb2312"?> <!--文檔版本信息, 注釋格式同Html-->
2<XMLPackage>
3 <clinetinfo ip=”202.101.
4 <data>
5 <row id=”
6 <row id=”
7<!--data中包含了元素 row的兩個實例,通過屬性id予以區分 -->
8 </data>
9 <memo length=”
10 <Actions acition=”update/insert”/> <!—該元素描述了一動作控制信息-->
11</XMLPackage>
TXMLDocument控件提供了我們兩種常用做法:一、直接用這個類封裝的屬性和方法來讀寫XML文件,我把它稱為自己解析法;二、用控件提供的XML Data Binding Wizard來創建一個適合用戶自己的接口單元,然後按照這個接口單元提供的許多接口來實現對同類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是這樣被創建的:
Var rootnode:XMLNode;
Rootnode:=XML.CreateNode(‘XMLPackage’);
XML. DocumentElement:=rootnode;
接著我們創建不同類型的子節點,前面的實例中的第9行的節點比較有代表性,它是一個帶有文本的子節點,同時又帶有兩個屬性節點,我們來看看它是怎麼被創建的,首先創建一個根節點:
XML.Active:=true;
xml.DocumentElement:=XML.CreateNode('XMLPacage');
接著我們創建memo子節點:
Var node:IXMLNode;
node:=XML.CreateNode('memo');
XML.DocumentElement.ChildNodes.Add(node);
這種創建兒子節點的方法比較好,當然還可以:
XML.DocumentElement.AddChild('XMLPacage');
來創建,建議使用第一種,CreateNode方法的用法是很豐富的,主要看它的第二個參數,上面其實是用了默認參數,下面我再看看怎樣創建這個子節點的文本的:
node.ChildNodes.Add(XML.CreateNode('Hello! I am yaya!',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_xml est.XML');
XML.Active:=false;
到此我們就結束了創建,至於添加,即插入節點,要插在指定節點後將上面的add(const Node: IXMLNode)方法換成Insert(Index: Integer; const Node: IXMLNode),其它用法也就一目了然,不再詳述了。
(2)讀取和修改
讀取比較簡單,主要是讀取子節點的文本和屬性值,方法是比較簡單,關鍵就是要利用IXMLNodeList接口來提供的一些屬性和方法來循環搜索到指定節點就OK了。文本和屬性值的讀取方法在Delphi中提供的方法有很多,我就講一種:NodeValue屬性,它是IXMLNode接口的一個屬性,它的值是OleVariant類型,意味著我們在XML文件裡雖然都是存的字符串,但Delphi會幫我們來轉換數據格式,比如有個屬性節點叫node:
Node.NodeValue:=16;//16是integer類型
雖然在XML文件中保存的是ASCII格式的16,但當我們要讀取的時候Delphi還會幫我們換回來的,只要這樣就可以了:
Var len: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樣板文件,然後由擊控件選擇XML Data Binding Wizard…,在這個向導中間會創建一個xdb文件。在彈出的向導中, 第一頁中, 可以看到Delphi已經幫你把XML文件中的各個節點對應到了接口,這裡你可以展開每個節點,編輯每個節點的屬性數據類型。單擊Next到下一個配置頁面,這裡你可以看到Delphi生成了各個節點接口的框架代碼。 單擊 Finsh 完成向導, 這樣Delphi將生成一個xdb 文件和與該XML文檔結構對應的XML接口單元。再以後訪問該類XML文件時,只需要參照生成的XML接口單元裡的方法和屬性就能很方便的讀取節點:
var xml :IXMLXMLPackageType; // 通過向導生成的根接口
begin
xml := LoadXMLPacage ( ''F:Work費亞的文件 askXMLlab_xml est.XML ' ); // 這個方法也是生成的接口單元中的。
XML.Data.Row[1].name; // 比如我要取得data下的第2個