AS3用XML,XMLList,QName,NameSpace這四個類來支持對XML的操作,flash.xml包下的XML相關類都是為了與AS2兼容的,就讓我們當它不存在吧。
一.XML中的attribute和property
在介紹AS3中對XML的操作前,我們先了解兩個詞attribute和property,在翻譯成中文時,這兩個詞都被翻譯成屬性,但是在XML中這兩個是不同的,下面我們簡單的說明一下。
<xml><item id="1">item 1</item></xml>
在這個XML中,item是property,它對應的值是item 1,而id是item這個節點的attribute。
二.XML的創建和初始化
1.用XML的構造函數初始化
var xml:XML = new XML("<xml><item>item 1</item></xml>");
2.直接用XML數據賦值
var xml:XML = <xml><item>1</item></xml>;
3.AS3還支持用已有的變量來構造XML,有點像模板。
var rootnode:String = "xml"; var itemnode:String = "item"; var value:String = "item 1"; var xml:XML = <{rootnode}><{itemnode}>{value}</{itemnode}></{rootnode}>; trace(xml.toString());
另外需要注意的是,XML類用ignoreComments(默認true),ignoreProcessingInstructions(默認true),ignoreWhitespace(默認true)等靜態屬性來控制在解析XML的時候是否忽略comment,空格等,用法很簡單,唯一需要注意的是對這些屬性的設置,需要在創建XML對象之前
三.訪問節點的attribute
1.可以用@操作符來輕松訪問XML或XMLList的attribute.
比如xml.@id,xml.@["id"]或xml["@id"]訪問當前節點或節點列表中名為id的attribute,xml.@*訪問當前節點或節點列表中所有的attribute.
2.用attribute函數獲取指定的attribute,用attributes函數獲取所有的attribute
四.訪問子節點
1.AS3支持在XML中用(.)和(..)輕松的訪問子節點。(.)訪問當前節點的子節點。而(..)表示當前節點的后代節點,所謂后代節點,可以是子節點,可以是子節點的子節點,也可以是子節點的子節點的子節點。。。
比如.item表示當前節點下property為item的子節點,如果有多個子節點的property都為item,那么這些子節點都會以XMLList的形式返回。
2.用child函數訪問子節點.
child函數中可以用各種參數來得到符合要求的節點。比如child("item")表示當前節點下property為item的子節點,如果有多個子節點的property都為item,那么這些子節點都會以XMLList的形式返回。child(0)返回第一個子節點。child("*")返回所有的子節點。
3.用children函數返回所有子節點。
4.用elements函數來訪問子節點,用法參加child,其默認參數為"*"
5.用descendants函數訪問后代節點。其作用相當於(..),可以用的參數和child函數一樣。
6.用for..in語句來遍歷XMLList中的一系列property name.用 for each..in語句來遍歷XMLList中的一系列property對象.
五.XML的節點操作
1.用appendChild和prependChild將一個property插入當前節點的所有子節點之前或之后。
2.用insertChildBefore和insertChildAfter將一個property插入當前節點的某子節點的之前或之后。
xml.insertChildBefore(child1,child2);這里child2就是要插入的節點,有一點要注意的就是child1必須是xml的子節點,如果不是將無法插入。
3.直接用(.)和(@)操作符賦值。看下面的例子
var xml:XML = <xml><item id="1">item 1</item></xml>; xml.item = "item 2"; xml.newitem = "item 3"; xml.item.@id = 2; xml.item.@newid = 3; trace(xml);
4.setchildren(newchilds)直接替換所有的子節點,並返回當前所有的子節點
5.replace(filter,value)將符合filter定義的對象替換為value。
var xml:XML = <xml><item id="1">item 1</item><item id="2">item 2</item></xml>; xml.replace(0, <item>new item</item>); trace(xml); xml.replace("item", new XMLList("<item id=\"1\">item 1</item><item id=\"3\">item 3</item>")); trace(xml); xml.replace("*",<item>replaceitem3</item>); trace(xml);
六.XML高級操作
AS3支持用比較復雜條件過濾方式獲取和操作想要的節點,有點像表達式一樣。這種方式是AS3的一大特色。
var xml:XML = <xml><item id="1"><name>a long name</name><desp>description1</desp></item><item id="2"><name>name2</name></item><beset>2</beset></xml> trace(xml.item.(@id == 1)); xml.item.(@id = "new attr value"); trace(xml); trace(xml.item.(name.toString().length > 6));
七.將XML對象轉換為String
AS3使用toString()和toXMLString()函數來轉換為String,這兩個函數對於復雜的XML都會完整的顯示整個XML,而對於只有單個節點的XML比如<item>1</item>。toString()將顯示節點的內容"1",而toXMLString()將顯示完整的節點。
另外AS3還能用靜態屬性prettyPrinting(默認true)和prettyIndent(默認2)來控制XML的toString()和toXMLString()函數獲得的string的格式。
八.其他
不一一詳述了,其他方法就大概列舉一下吧
命名空間
inScopeNamespaces()返回節點所有的Namespace,父節點的Namespace會被子節點繼承
addNamespace()
removeNamespace()
namespace()
setNamespace()
localname()
setlocalname()
namespaceDeclarations()
name()返回qualified name
setname()
靜態屬性
defaultSettings()獲取ignoreComments, ignoreProcessingInstructions, ignoreWhitespace, prettyIndent,和prettyPrinting的默認值,將所有值以對象的形式返回
setSettings()
settings()
雜
childIndex()獲取節點在父節點所有子節點中的位置。
comments()獲取所有的comment
processingInstructions()獲取processingInstructions
text()獲取所有的文本節點
contains(value)判斷某個XML對象是否等於value
copy()復制節點,能夠復制整個節點,但不會復制節點的父節點
hasComplexContent()節點是否是復雜節點。
hasSimpleContent()節點是否是簡單節點
hasOwnProperty(name)節點是否擁有某property
length()XMLList的節點數。對於單個XML對象返回1
nodeKind()獲取節點類型text, comment, processing-instruction, attribute或者element.
normalize()合並文本節點
parent()父節點
toJSON(string)