程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> delphi中的XML解析控件TXMLDocument的用法

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

編輯:Delphi

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

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

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

2<XMLPackage>  

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

4  <data>

5     <row id=”1” name="太陽" sex=”男” age="24" duty="軟件工程師"/>

6     <row id=”2” name="月亮" sex=”女” age="25" duty="部門經理"/>

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

8  </data>

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

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個

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved