XML類和XMLList類的區別

2021-07-24 11:47:47 字數 3895 閱讀 4784

一、xml類和xmllist類的區別

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

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

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

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

示例1:xml元素,只包含乙個標籤,同時也是頂級標籤

黑桃

示例2:xml元素,包含多個標籤,但只有1個頂級標籤黑桃

決鬥 示例3:xmllist元素,擁有2個同級的頂級標籤黑桃

決鬥 有些時候,某些類的方法返回的是xmllist物件,但該xmllist物件只包含乙個xml元素,如上篇中最後一例中的myxml.root.(@id == 2).cardname。那麼此時,該xmllist物件將被視為xml物件。

二、xml的四則運算

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

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

(1) = 號運算

var myxml:xml =黑桃

我們先加入語句:

myxml.cardcolor = "梅花";

trace(myxml.toxmlstring());

返回:梅花

我們接著加入語句:

myxml.cardname = "決鬥"

myxml.@id = 1;

trace(myxml.toxmlstring());

返回:梅花 決鬥

(2) + 法運算

var x1:xml = test1

var x2:xml =test2

var xlist:xmllist = x1 + x2;

trace(xlist.toxmlstring());

返回:test1

test2

注意:xlist的資料型別為xmllist,如果是xml會報錯哦!

(3) 括號運算

示例:var myxml:xml =黑桃

決鬥 黑桃

雌雄雙股劍

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

a、myxml.root.(cardcolor == "黑桃").cardname

由於符合該條件的物件有2個,所以返回結果是乙個xmllist物件:決鬥

雌雄雙股劍

b、myxml.root.(@id == 1).cardname

由於符合該條件的物件只有1個,雖然是xmllist物件,但視為xml,所以返回:

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

myxml.root.(@id >= 1).cardname

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

三、xml類、xmllist類常用方法

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

示例:var myxml:xml =黑桃

決鬥 黑桃

雌雄雙股劍

(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()) //返回:黑桃

兩者返回內容不同。

(2) attribute()、attributes()

在示例中:

myxml.root[0].@id

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

這兩個是等值的

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

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

這兩個也是等值的

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

只有以下這種情況例外。大家注意看,示例中,第乙個標籤有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 =

text

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

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

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

對三者功能做個總結:

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

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

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

(4) 刪除xml節點

e4x規範中,定義有delete和deletebyindex方法,用來刪除特定的xml節點。但是在as3.0中,並沒有這兩個方法。甚至在幫助文件中,也沒有提及如何刪除乙個xml節點。真不負責任啊!!!

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

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

delete myxml.root[1];

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

myxml.setchildren(test);

trace(myxml.toxmlstring());

返回:test

但是setchildren()方法是必須帶引數的,不然倒也是乙個刪除節點的方法。

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

Hashtable和HashMap類的區別

下面再轉一篇關於兩個類的區別,比較簡單的過一下 最近同學找工作,經常被問到這個問題rt,所以。hashtable的應用非常廣泛,hashmap是新框架中用來代替hashtable的類,也就是說建議使用hashmap,不要使用hashtable。這裡簡單分析他們的區別。1.hashtable的方法是同...

XML 和 List 互轉類

xml 和 list 互轉類 using system using system.collections.generic using system.linq using system.text using system.xml namespace xmlhelper 物件例項集轉成xml 物件例項集...

操作XML的類

net framework提供了許多命名空間和類,使xml的讀取 處理和寫入非常簡單。介紹幾個易於操作xml的類。1 xmldocument類 using system.xml xmldocument document new xmldocument document.load xmlpath 2 ...