as3 XML類和XMLList類的區別
一、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 >= 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 >= 1).Cardname);
結果:報錯!因為XML結構不完全一致。
第二種方法:
trace(myXML.root.(attribute("id") >= 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類的區別