AS3引入了E4X ,它是根據ECMAScript標準處理XML 數據的全新機制。這使得程序員在程序中無縫地操作XML。在AS3中可以使用XML字面值將XML數據直接寫入代碼,該字面值將被自動解析。
一、AS3中的XML入門
1.可以將XML直接寫入代碼
public var employeelist:XML=<employeelist> <employee> <name first="Conan" last="O'Brien" /> <title>Host</title> </employee> <employee> <name first="Andy" last="Richter" /> <title>SideKick</title> </employee> </employeelist>;
2.在字面值中使用as3的表達式:可以將ActionScript代碼直接嵌入到XML數據中,方法時將希望添加的代碼包圍在大括號{}中,這樣便可以使用動態(tài)生成的值填充數據集合。
var efname:String="A"; var elname:int=1; var etitle:String="+"; var employeelist:XML=<employeelist> <employee> <name first={efname} last={elname} /> <title>{etitle}</title> </employee> </employeelist>; trace(employeelist.toXMLString());
二、理解XML類
每個類都表示不同的數據類型,可以在操作XML數據時使用它們。它們都位于ActionScript API 的頂層,不需要import 語句便可以使用它們。
XML:XML對象表示一塊簡單的XML數據,如元素、文本節(jié)點、注釋或處理指令。將所有這些不同的節(jié)點定義為XML對象,可以對它們使用操作XML數據的方法,而不必擔心它們的類型是什么。
XMLList :是XML對象的有序集合,包含在其中的XML數據可以是一個或者多個XML對象,XML對象的部分或一些單獨的節(jié)點。XML類的一些方法,如children() ,將返回XMLList形式的結果。XMLList擁有許多與XML類相同的方法,大多數操作都可以交替使用。注意,XMLList中的項目是平行存在的,它們都沒有父節(jié)點。
三、通過E4X訪問XML
1.使用點運算符訪問元素
public var movieList:XML=<movieList> <listName>My Favorite movies</listName> <movie id="123"> <title>Titus</title> <year>1999</year> <director>Julie Taymor</director> </movie> <movie id="456"> <title>Rushmore</title> <year>1998</year> <director>Wes Anderson</director> </movie> <movie id="789"> <title>Annie Hall</title> <year>1977</year> <director>Woody Allen</director> </movie> </movieList>;
使用點運算符可以訪問movieList中的任何元素。只需要將訪問的元素作為movieList對象的屬性,寫出塔的名稱即可,如:movieList.listName
對擁有多個相同類型節(jié)點的元素,需要以數組的方式訪問,如 movieList.movie[0]
2.使用方法訪問子節(jié)點
A、 child(propertyName:Object):XMLList
獲取特定子節(jié)點集合,如movieList.child("movie") 與movieList .movie相同,使用它可以搜索指定名稱的任何字節(jié)點,如movieList.movie.child("title") 。
使用propertyName參數可列出特定XML子項的內容。列如,若要返回名為<title>
使用子項的索引編號,可以生成相同的結果。索引編號標示該子項在其XML子項列中的位置。例如,movieList.child(0)將返回列表中的第一個子項。
使用星號(*)可以返回xml文檔中所有的子項,例如,moveList.child("*").
B、childIndex():int
確定該XML對象在其父項上下文中從0開始編制索引的位置。
如:trace(movieList.child(2).child("director").childIndex());
trace(movieList.movie[0].year.childIndex());
C、 children():XMLList
按XML對象的顯示順序列出其子項。根據下標獲取子元素,如:
trace(movieList.children()[0].toXMLString());
trace(movieList.children()[2].children()[0].toXMLString());
D、 length():int返回特定子節(jié)點集合的長度
E、 name():Object返回正在訪問的子節(jié)點的節(jié)點名稱。
F、 elements(name:Object = *):XMLList 列出某XML對象的元素。
3.使用at運算符@訪問屬性
trace(movieList.child("movie")[0].@id);
如果要訪問某標記的所有屬性,可以使用*號,如trace(movieList.child("movie")[0].@*);
與.運算符對應的方法是child()和children()
與@運算符對應的方法是attribute()和attributes()
4.訪問元素中的文本
要明確的返回某個元素的文本節(jié)點,可以使用text()方法,該方法返回一個由文本節(jié)點組成的XMLList。
注意:操作XML時,toString()返回節(jié)點的值(可以為空),toXMLString()返回節(jié)點和其中的文本。
5.訪問祖先節(jié)點、訪問子孫節(jié)點
E4X中的一個非常強大的特性就是能夠直接訪問子孫節(jié)點。使用子孫節(jié)點存取程序運算符(..),可以深入訪問元素中的節(jié)點,而不用擔心該節(jié)點的路徑是什么。這種方法不僅適用于元素,而且還適用于屬性和其他類型的XML對象。
trace(movieList..title);//這個我真帥
trace(movieList..@*.toXMLString());
此運算符對應的方法為:descendants()
使用此方法時需要注意一點,它會返回所有匹配的結果,即使樹的不同層次上的標記擁有相同的名稱也是如此。
訪問祖先結點
parent()方法將返回特定XML對象的上一層的節(jié)點。
6.迭代元素的子節(jié)點
XMLList類似專用于存儲XML數據段的數組,它們與數組一樣擁有長度和下標,可以像操作數組那樣對它們執(zhí)行迭代操作。 var movieTitles:Array=new Array(); var movies:XMLList=movieList.movie; for(var i:int=0;i<movies.length();i++){ movieTitles[i]=movies[i].title.text(); } movieTitles.sort(); trace(movieTitles); 此外,可以使用for...in或for each...in語句迭代XMLList對象 var movies:XMLList=movieList.movie; for(var movie:String in movies){ trace(movies[movie].title); } var movies:XMLList=movieList.movie; for each(var movie:XML in movies){ trace(movie.title); }
7.篩選XML中的項目
EX4增加了一種強大的功能:使用XML圓括號篩選運算符動態(tài)地篩選數據。在XML樹中創(chuàng)建路徑時,可以在圓括號中間添加一個布爾表達式形式的搜索來判斷條件,符合搜索條件的任何節(jié)點都將返回到一個XMLList中。
var movies:XMLList=movieList.movie.(year>1985);
trace(movies);
movies=movieList.movie.(@id=="789");
trace(movies);
movies=movieList.movie.(director.search("W")!=-1 && title.search(" ")==-1);
trace(movies);
四、構建XML對象
1.結合XML節(jié)點
與合并字符串類似,可以使用+或+=運算符將額外的子元素添加到某個XMLList中。所添加的值不需要與XML對象中其他元素保持相同的格式??梢允褂?和+=運算符將額外的節(jié)點添加到具體元素中。
var anotherMovie:XML=<movie id="222">
<title>Tron</title>
<year>1982</year>
<director>Steven Lisberger</director>
</movie>;
movieList.movie+=anotherMovie;
appendChild():與+=類似,將值添加到XML對象或XMLList的末尾。
prependChild():將值添加到對象的開始部分。
insertChildAfter()、insertChildBefore():將值添加到指定位置。
movieList.movie[0].appendChild(<area>你</area>);
movieList.movie[1].prependChild(<area>真</area>);
movieList.movie[2].insertChildBefore(movieList.movie[2].year,<area>棒</area>);
movieList.movie[3].insertChildAfter(movieList.movie[3].year,<area>呀</area>);
2.刪除XML節(jié)點
與結合XML結點不同,沒有任何方法可以刪除XML節(jié)點,相反,只能使用delete運算符。該運算符用于從樹中刪除指定的元素或值。
delete movieList.movie.@*;//刪除所有屬性
delete movieList.movie[1];
3.復制XML對象
使用copy方法復制XML對象。
var template:XML=<person><name><first /><last /></name></person>;
var me:XML=template;//me引用template,對me的修改也是對template的修改
var it:XML=template.copy();//創(chuàng)建副本
me.name.first="First Name";
me.name.last="Last Name";
4.替換XML節(jié)點中的值
setChildren()方法可以一次替換XML對象中的所有節(jié)點
replace()方法則替換XML對象中的單個節(jié)點
var m123:XMLList=movieList.movie.(@id==123);
//m123.setChildren(null);
m123.setChildren(<title>Avatar</title>+<year>2009</year>+<director>Cameron</director>);//注意使用+號連接多個節(jié)點
m123.replace("title",<title>阿凡達</title>);
5.與字符串相互轉換
將字符串轉換為XML時需要格外注意,只能使用格式良好的XML文本,操作失敗將會造成運行時錯誤。
var xml:XML=XML(xmlString);
美觀打印
XML.prettyPrinting:默認值為true,將其設置為false時,XML字符串將自動格式化、刪除空標記和額外的空白符。
XML.prettyIndent:默認值為2,設置縮進的空格數
五、從外部資源加載XML數據
import flash.net.*; var movieList:XML; var url:URLRequest=new URLRequest("movieList.xml"); var loader:URLLoader=new URLLoader(url); loader.addEventListener(Event.COMPLETE,onLoadCompleted); function onLoadCompleted(e:Event):void{ if(loader.data){ movieList=XML(loader.data); trace(movieList); } };
六、收集XML節(jié)點的元信息
1.查找節(jié)點類型
要判斷當前節(jié)點的類型,可以對要檢查的分支使用nodeKind()方法。該方法返回一個描述節(jié)點類型的字符串:element attribute text comment processing-instruction
2.判斷節(jié)點內容的類型
hasSimpleContent():簡單內容類型
hasComplexContent():復雜內容類型
七、使用命名空間、使用注釋和處理命令、設置XML類型選項
☆使用名稱空間
名稱空間是在XML中使用的一種約定,其作用是將功能相似的XML元素和屬性歸入同一集合中,這與使用包對類進行分類極為相似。XML文件將在名稱空間聲明中定義名稱空間的名稱和一個惟一的標識符,用于將它與其他名稱空間區(qū)分開來。
var ns:Namespace=new Namespace(uri);//省略前綴
var ns:Namespace=new Namespace(prefix,uri);
示例
var diffbook:XML=<book xmlns:bible="http://www.gaobar.cn">
<bible:chapter>Working with XML</bible:chapter>
</book>;
可以使用名稱空間訪問節(jié)點——雙冒號(::)結合名稱空間對象來訪問非默認名稱空間的節(jié)點,如
var bible:Namespace=diffbook.namespace("bible");
trace(bible);//http://www.gaobar.cn
trace(bible.prefix);//bible
trace(bible.uri);//http://www.gaobar.cn
trace(diffbook.bible::chapter);//Working with XML
trace(diffbook.bible::chapter.name());//http://www.gaobar.cn::chapter
trace(diffbook.bible::chapter.localName());//chapter
相關方法addNamespace()、removeNamespace()、setNamespace()、localName()參閱幫助文檔。
☆使用注釋和處理指令
代碼中包含的XML注釋塊和處理指令都不是節(jié)點,要訪問這些值,可以使用comments()和processingInstructions()方法分別獲取注釋和處理指令的XMLList。
注意,靜態(tài)屬性ignoreComments和ignoreProcessingInstructions的默認值都是true,需要將它們設置為false才能保證comments()和processingInstructions()方法能夠正常運行。
☆設置XML類的選項
ignoreWhitespace
ignoreComments
ignoreProcessingInstructions
prettyPrinting
prettyIndent
可以使用settings()靜態(tài)方法訪問所有這些設置,它將返回一個含有各變量值的對象。
還可以使用defaultSettings()靜態(tài)方法獲取所有這些屬性的默認值,setSettings()靜態(tài)方法可用于將settings對象修改為新Object。
XML.setSettings(XML.defaultSettings());//將XML設置恢復為默認值