今天我们来看看AS3中新的XML处理方法:E4X,直到现在,ECMA脚本语言规范(ECMA-262)--AscriptScript 3.0的核心基础,并没有提供任何的XML数据处理类或方法。AcriontScript之前的版本(从Flash 5中的ActionScript开始)有一些处理XML数据的类和方法,但是它们并不是基于ECMAScript标准的。
新的ECMA脚本语言规范第4版草稿中定义了一系列新的处理XML数据的类和方法。这些类和方法的集合并命名为E4X("ECMAScript for XML"),ActionScript 3.0包括如下新的E4X类: XML、XMLList、 QName和Namespace。
E4X类的方法、属性和操作的开法基于以下的目标:
简单--E4X尽可能的使得处理XML数据的代码容易编写并且易于理解。 一致性--E4X的方法于Actionscript的其它部分协调一致。 友好--实用非常好理解的操作符处理XML数据,如点号(.)。 注意:为避免与E4X中的新的XML类冲突,原来ActionScript 2.0中的XML类在ActionScript 3.0被重命名为XMLDocument,为了向前兼容,在ActionScript 3.0中遗留下来的类--XML、XMLNode、XMLParser和XMLTag--被包含进了flash.xml包中。新的E4X类是核心类--使用它们不需要import任何包。
初始化XML对象
XML对象可以代表一个XML元素、属性、注释、处理指令或文本元素。在ActionScript 3.0中我们可以直接将XML数据赋值给变量:
var myXML:XML = <order> <item id=’1’> <menuName>burger</menuName> <price>3.95</price> </item> <item id=’2’> <menuName>fries</menuName> <price>1.45</price> </item>
</order>你也可以使用new 构造器来从XML数据文本创建一个XML对象实例:
var myXML:XML = new XML("<order><item id=’1’><menuName>burger</menuName><price>3.95</price></item></order>")
如果XML数据不是格式完好的(如少了结束标签),那么将会出现运行时错误。 注意,你也可以将变量实例传入XML数据中:
var tagname:String = "item"; var attributename:String = "id"; var attributevalue:String = 5; var content:String = "Chicken"; var x:XML = <{tagname} {attributename}={attributevalue}>{content}</{tagname}>; trace (x.toXMLString()) // Output: <item id="5">Chicken</item>
通常,我们的应用是从外部源导入XML数据,如web service或RSS feed,以下是一个从远程URL导入XML数据的例子:
var myXML:XML = new XML(); var XML_URL:String = "http://www.example.com/Sample3.xml"; //创建URLRequest。 var myXMLURL:URLRequest = new URLRequest(XML_URL); //使用URLLoader导入数据。 var myLoader:URLLoader = new URLLoader(myXMLURL); //添加事件监听器,以在XML数据导入完成后处理XML数据。 myLoader.addEventListener("complete", xmlLoaded); //导入完成后,创建使用导入的数据创建XML对象 function xmlLoaded(evtObj:Event) { var myXML:XML = XML(myLoader.data); trace("Data loaded."); }
为了演示代码的清晰性,本文中的大部份示例都第1种直接使用文本的方法创建XML对象。 E4X包含一些直观的方法XML数据的操作符(如.和@:用于访问属性):
//获取第1个item的menuName值 trace(myXML.item[0].menuName); // Output: burger //获取第1个item的id属性值 trace(myXML.item[0].@id);//Output:1 //获取id属性为2的item的menuName值 trace(myXML.item.(@id==2).menuName); // Output: fries //获取menuName为burger的item的price值 trace(myXML.item.(menuName=="burger").price); // Output: 3.95
你也可以使用appendChild()方法给XML添加新的子节点:
var newItem:XML = <item id="3"> <menuName>medium cola</menuName> <price>1.25</price> </item> myXML.appendChild(newItem);
当然你也可以使用@和.操作符来更新数据:
myXML.item[0].menuName="regular burger"; myXML.item[1].menuName="small fries"; myXML.item[2].menuName="medium cola"; myXML.item.(menuName=="regular burger").@quantity = "2"; myXML.item.(menuName=="small fries").@quantity = "2"; myXML.item.(menuName=="medium cola").@quantity = "2";
访问XML数据 你可以使用.(点号)和..操作符访问XML对象的子节点,使用@操作符访问某一节点的属性。考虑以下XML对象:
var x:XML = <book ISBN="0942407296"> <title>Baking Extravagant Pastries with Kumquats</title> <author> <lastName>Contino</lastName> <firstName>Chuck</firstName> </author> <pageCount>238</pageCount> </book> <book ISBN="0865436401"> <title>Emu Care and Breeding</title> <editor> <lastName>Case</lastName> <firstName>Justin</firstName> </editor> <pageCount>115</pageCount> </book> </order>
对象x.book表示一个包含所有名称为book的子节点的XMLList对象,该XMLList包含两个XML对象(两个book节点)。 对象x..lastName表示一个包含XML树结构下部所有的lastName属性的XMLList对象,该XMList包含两个XML对象(两个LastName属性)。 对象x.book.editor.lastName表示一个包含所有x对象的所有名称为book的子节点的所有名称为editor的子节点的所有lastName节点的XMLList对象,该XMLList只包含一个XML对象(值为"Case"的lastName属性)。
[1] [2] [3] [4] 下一页 |