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)



作者:Jingle Guo
出处:http://www.cnblogs.com/studynote/
若标题中有“转载”字样,则本文版权归原作者所有。若无转载字样,本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/studynote/p/2989649.html