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)