ActionScript3(AS3)類庫學習之(三)——靈活操作XML


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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM