1. 程式人生 > >as3 XML類和XMLList類的區別

as3 XML類和XMLList類的區別

tails type 功能 相同 rep 讀書 id屬性 == 等於

一、XML類和XMLList類的區別

AS3.0中,處理XML主要用到兩個主類,XML類和XMLList類,這兩個類的很多內容是共通的。應該有人會問,XML和XMLList的區別是什麽?

XML:表示單個的 XML元素。也就是說,該XML元素中,只有一個最頂級的標簽,但可以包含其他子標簽。

XMLList:表示一組的XML元素。也就是說,該XML元素中,存在多個同級別的頂級標簽。當然每個標簽也可以包含其他子標簽。

呃,這個定義是我自己下的,能理解不?我舉例說明吧。

示例1:XML元素,只包含一個標簽,同時也是頂級標簽

<Cardcolor>黑桃</Cardcolor>

示例2:XML元素,包含多個標簽,但只有1個頂級標簽

<root>

<Cardcolor>黑桃</Cardcolor>

<Cardname>決鬥</Cardname>

</root>

示例3:XMLList元素,擁有2個同級的頂級標簽

<Cardcolor>黑桃</Cardcolor>

<Cardname>決鬥</Cardname>

有些時候,某些類的方法返回的是XMLList對象,但該XMLList對象只包含一個XML元素,如上篇中最後一例中的myXML.root.(@id == 2).Cardname。那麽此時,該XMLList對象將被視為XML對象。

二、XML的四則運算

四則運算,這個詞熟吧,好懷念的讀書時代。好吧,跑題了!

可以對XML進行一些常規運算,這些運算方式由於形式簡單,因此非常實用。

(1) = 號運算

var myXML:XML =

<card>

<Cardcolor>黑桃</Cardcolor>

</card>

我們先加入語句:

myXML.Cardcolor = "梅花";

trace(myXML.toXMLString());

返回:

<card>

<Cardcolor>梅花</Cardcolor>

</card>

我們接著加入語句:

myXML.Cardname = "決鬥"

myXML.@id = 1;

trace(myXML.toXMLString());

返回:

<card id="1">

<Cardcolor>梅花</Cardcolor>

<Cardname>決鬥</Cardname>

</card>

(2) + 法運算

var x1:XML = <a>test1</a>

var x2:XML = <b>test2</b>

var xList:XMLList = x1 + x2;

trace(xList.toXMLString());

返回:

<a>test1</a>

<b>test2</b>

註意:xList的數據類型為XMLList,如果是XML會報錯哦!

我們也可以看到,appendChild()方法其實沒什麽用。

(3) 括號運算

有關括號運算的方式,其實上一篇中我有提及,但我沒有具體的說明,只是介紹了這麽個用法。事實上,在XML中,可以使用括號運算來對XML對象進行過濾。

示例:

var myXML:XML =

<card>

<root id = ‘1‘ type = ‘a‘>

<Cardcolor>黑桃</Cardcolor>

<Cardname>決鬥</Cardname>

</root>

<root id = ‘2‘ type = ‘b‘>

<Cardcolor>黑桃</Cardcolor>

<Cardname>雌雄雙股劍</Cardname>

</root>

</card>

請參看和比較以下表達式:

A、myXML.root.(Cardcolor == "黑桃").Cardname

由於符合該條件的對象有2個,所以返回結果是一個XMLList對象:

<Cardname>決鬥</Cardname>

<Cardname>雌雄雙股劍</Cardname>

B、myXML.root.(@id == 1).Cardname

由於符合該條件的對象只有1個,雖然是XMLList對象,但視為XML,所以返回:

決鬥

C、過濾條件不僅限於等於,例如,下面的表達是也是合法的:

myXML.root.(@id &gt;= 1).Cardname

當使用以上括號運算時,需要特別註意,XML對象的結構需要保持一致。不然如果引用到不一致的部分作為判斷,會產生報錯!

三、XML類、XMLList類常用方法

其實,這兩個類真的很接近,汗!下面的講解中,我需要用到下面這個XML示例:

示例:

var myXML:XML =

<card>

<root id = ‘1‘ type = ‘a‘>

<Cardcolor>黑桃</Cardcolor>

<Cardname>決鬥</Cardname>

</root>

<root type = ‘b‘>

<Cardcolor>黑桃</Cardcolor>

<Cardname>雌雄雙股劍</Cardname>

</root>

</card>

(1) toString() 和 toXMLString()

若XML元素包含復雜元素,兩者功能相同。

若XML元素只包含簡單內容,兩者有區別。toString()只包含內容,toXMLString()包含標簽。

如示例中,

trace(myXML.root[0].toString())

trace(myXML.root[0].toXMLString())

兩者返回內容相同。

trace(myXML.root[0].Cardcolor.toString()) //返回:黑桃

trace(myXML.root[0].Cardcolor.toXMLString()) //返回:<Cardcolor>黑桃</Cardcolor>

兩者返回內容不同。

(2) attribute()、attributes()

在示例中:

myXML.root[0].@id

myXML.root[0].attribute("id")

這兩個是等值的

trace(myXML.root[0].@*)

trace(myXML.root[0].attributes())

這兩個也是等值的

所以,一般情況下,盡量使用@符號來訪問屬性比較好。

只有以下這種情況例外。大家註意看,示例中,第一個<root>標簽有id屬性,而第二個沒有,然後我們使用上面講的括號來過濾時:

第一種方法:

trace(myXML.root.(@id &gt;= 1).Cardname);

結果:報錯!因為XML結構不完全一致。

第二種方法:

trace(myXML.root.(attribute("id") &gt;= 1).Cardname);

結果:沒有報錯!說明用該方法可以去除不一致的XML結構。

(3) child()、children()、elements()

在示例中:

trace(myXML.root[0]);

trace(myXML.child("root")[0]);

這兩者是等值的。

但一般,使用child的用處,還是為了循環遍歷。用下面的語句,可以獲得子項的數目。

myXML.child("root").length();

但比較尷尬的是,如果只是為了這個目的,也可以用下面的語句等值實現:

myXML.children().length();

但上面的兩個方法,返回的數量都是所有元素的數量,比如下面的例子:

var xml:XML =

<a>

<b></b>

<c></c>

text

</a>;

trace(xml.children().length()); //返回:3

如果只要返回具有標簽的元素,那麽需要用到elements()方法。

trace(xml.elements().length()); //返回:2

對三者功能做個總結:

child():返回指定的某個子元素

children():返回子元素的列表

elements():返回具有標簽的子元素的列表

(4) 刪除XML節點

E4X規範中,定義有delete和deleteByIndex方法,用來刪除特定的XML節點。但是在AS3.0中,並沒有這兩個方法。甚至在幫助文檔中,也沒有提及如何刪除一個XML節點。真不負責任啊!!!

不過,其實是可以實現的,用delete方法。

如示例,我們要刪除第二個<root>節點,可以用以下語句:

delete myXML.root[1];

用setChildren()方法,可以重寫XML節點,但是會把當前的XML節點全部清除。例如:

myXML.setChildren(<a>test</a>);

trace(myXML.toXMLString());

返回:

<card>

<a>test</a>

</card>

但是setChildren()方法是必須帶參數的,不然倒也是一個刪除節點的方法。

還有一個replace()方法,也是用於替換的,並且可以指定要替換的內容,我這裏不做介紹了,有興趣的朋友可以參考幫助。

http://blog.csdn.net/z9061/article/details/8022005

as3 XML類和XMLList類的區別