在 AS3 中處理 XML

ActionScript - XML

在 ActionScript3 中處理 XML。

E4X

在AS3中使用E4X規格來處理XML,E4X的全名是ECMAScript for XML。它是存取XML的一種新方式,在E4X之前是以物件的概念來存取XML,而E4X則是把XML當成原始資料(即一般資料型態,例如字串、數字等)來存取。(資料來原:Wiki)

ECMA(The European Computer Manufacturers Association)是制定JavaScript的協會,所以ECMAScript就是JavaScript,E4X就是支援XML的JavaScript。(資料來源:w3Schools)。

XML

XML(eXtensible Markup Language)可擴展標記語言,採用樹狀結構和類似HTML的標籤來組成。

幾個重點:
  1. XML是以純文字來撰寫,使用標籤來結構化資料。
  2. 每個XML文件會有一個根節點,和許多子節點。
  3. 節點又可稱為元素或標籤。
  4. 節點有兩種形式:包含頭尾,例如:<node></node>;或未包含內容的空白節點,例如:<node />(後面的斜線代表結尾)
  5. 節點可以有屬性(或稱特質),例如:<node id="001"></node>,id就是屬性。
  6. 標籤可以包含標籤,稱為容器。

ActionScript3.0中處理XML的類別

兩個主要類別:
  • XML:代表單一XML元素(節點),下面可以有很多子系。
  • XMLList:代表一組XML元素,屬於旁系的元素。
簡單的說,XML(單個)是往下包含,自己本身是父親,下面有很多子孫。XMLList(多個)則是同一父親的兄弟姐妹(即標籤名稱是一樣的)。

另外有兩個用來處理命名空間的類別:QName、Namespace。命名是用來辨識該物件所包含的資料類型。

使用E4X來處理XML的範例

XML文件通常是從網路抓取的資料,這邊則是直接給假資料。
var data:XML =
<order>
<item id="1">
<title>egg</title>
<price>10</price>
</item>
<item id="2">
<title>fish</title>
<price>100</price>
</item>
</order>;
=======output=======
trace(data.item[0].title); //egg
trace(data.item.(@id==2).title); //fish
trace(data.item.(title=="fish").price); // 100
trace(data.item[0].*); //<title>egg</title> <price>10</price>
trace(data..title); //<title>egg</title> <title>fish</title>

解說:

  1. 變數data等同於根節點<order>,所以通常建議把變數名稱設成和根節點名稱相同,比較不會產生混亂(這邊因為方便說明,所以沒有設成一樣,當然也不強制)。
  2. xml文件的資料結尾記得要加分號(;)
  3. 點(.)用來存取/設定子結點。
  4. at(@)用來存取/設定屬性。
  5. 星號(*)用來取得該元素之下的所有子元素。若一個元素有多個屬性,可以用@*來取得該元素的全部屬性值。
  6. 兩個點(..)用來搜尋符合的元素。
  7. 比對資料是用雙等號(==)而非指派資料用的等號(=),所以當然也可用大於(>)小於(<)來比較,括號(())則是用來包含這個比較式。
  8. 這裡的<item>標籤就是前一節說的XMLList,所以可以這麼寫
    var data2:XMLList = data.item;
  9. 如果要新增子節點,有兩個方法:appendChild()或+=
    var item:XML =
    <item id="3">
    <title>meat</title>
    <price>50</price>
    </item>;
    ===================
    data.appendChild(item); //方法1
    data.item += item; //方法2
    trace(data.item); //多了一個item
  10. 用迴圈來依序取得節點的資料
    var total:Number = 0;
    for each (var x:XML in data.item) {
    //記得要轉型成數值型態,不然會變成字串相加
    total += Number(x.price);
    }
    trace(total);
  11. 相同名稱的子元素的存取方法和陣列類似,都是以[索引值]來取得。(索引從0開始)

XML物件

XML物件可以是:
  • 元素
  • 屬性
  • 註解 <!--註解表示方式-->
  • 處理指示 <? 處理指示的表示方式 ?>
  • 文字元素

關於註解

使用註解時,因為XML的預設是取消註解的解讀,即 XML.ignoreComments = true;所以我們必須在使用XML之前先把ignoreComments屬性設為false。然後使用comments()方法來取得註解,會傳回XMLList。
<data>
<!-- This is a comment. -->
<item ....略
==================================
trace(data.comments().length()); //1
trace(data.comments()[0].toXMLString()); //<!-- This is a comment. -->

關於處理指示

和註解做法相同,預設為 XML.ignoreProcessingInstructions = true; 所以要改為false才有用。然後使用processingInstructions()方法來取得資料。

XML變數資料的設定

方法1:就是前面範例使用的方法,直接給值。
方法2:將XML文件存在字串中,在傳給XML物件,例如:new XML(data); //data是含有XML結構的字串
方法3:使用代替法,用大括號({})來代替資料,範例如下:
var tag:String = "book";
var attribute:String = "ISBN";
var value:String = "987654321";
var content:String = "Java";

var book:XML = <{tag} {attribute} = {value}>{content}</{tag}>;
trace(book.toXMLString()); //<book ISBN="987654321">Java</book>
方法4:透過URL載入XML資料,使用URLLoader類別來當資料載體,並用URLRequest類別來指定資料路徑,此外要注意的是,必需用 Event.COMPLETE 事件來確認資料是否已完全載入,此時才可以對XML文件做動作,否則會出現無資料的狀況。

範例程式碼:
var url:String = "http://tw.stock.yahoo.com/rss/url/d/e/N4.html";
//var url:String = "xmlfile.xml";
var loader:URLLoader = new URLLoader();
var req:URLRequest = new URLRequest(url);
loader.load(req);
loader.addEventListener(Event.COMPLETE, dataCompleteF);
=================
private function dataCompleteF(e:Event):void {
var data:XML;
var loader:URLLoader = e.target as URLLoader;
if (loader != null) {
data = new XML(loader.data);
trace(fileData.toXMLString());
}else {
trace("load error!");
}
}

XML與字串的互換

所有的XML屬性、名稱、值等都是字串,XML可以轉成字串,字串也可以轉成XML。所以你可以把讀進來的XML轉成使用HTML標籤來表示,如此就可以自己的格式來顯示資料。
本文網址:http://blog.tonycube.com/2010/01/as3xml.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。