分享
 
 
 

AS3中新的XML处理方法 - E4X

王朝other·作者佚名  2006-11-24
窄屏简体版  字體: |||超大  

今天我们来看看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属性)。

访问父节点和子节点

parent()方法返回XML对象的父节点。

你可以使用子节点列表的顺序索引值来访问特定的子节点,例如,假定某一XML对象x有两个名称为book的子节点,你可以如下访问它们:

//第1个book节点

x.book[0]

//第2个book节点

x.book[1]

要访问孙子节点,我们可以如下直接使用儿子和孙子节点的索引值来访问:

x.book[0].title[0]

不过如果x.book[0]只有一个名称为title的子节点的话,那么可以省略索引:

x.book[0].title

类似的,如果x对象只有一个book子节点,并且该book节点的子节点对象只有一个title对象,那么两个索引值都可以省略:

x.book.title

注意,你也可以使用child()方法,直接使用名称访问特定的子节点:

var x.XML =

<order>

<book>

<title>Dictionary</title>

</book>

</order>

var childName:String = "book";

trace (x.child(childName).title) // Output: Dictionary

访问属性

我们使用使用@操作符访问XMLNode属性:

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>

//获取第1个item的id属性值

trace(myXML.item[0].@id);//Output:1

使用属性或元素值过滤XML数据

我们可以使用特定的元素名称和属性值来定位到特定的元素考虑以下XML对象:

var x:XML =

<employeeList>

<employee id="347">

<lastName>Zmed</lastName>

<firstName>Sue</firstName>

<position>Data analyst</position>

</employee>

<employee id="348">

<lastName>McGee</lastName>

<firstName>Chuck</firstName>

<position>Jr. data analyst</position>

</employee>

</employeeList>

以下是正确的访问方法:

//lastName为“McGee”的employee对象,第1个employee节点

x.employee.(lastName == "McGee") // The first employee node

//lastName为“McGee”的employee对象的firstName节点,第1个employee节点的节点

x.employee.(lastName == "McGee").firstName // The firstName property of that node

//lastName为“McGee”的id属性

x.employee.(lastName == "McGee").@id // The value of the id attribute

//所有id属性值为347的employee对象列表

x.employee.(@id == 347)

//id属性值为347的employee对象的lastName子节点

x.employee.(@id == 347).lastName

//所有id属性值大于347的employee对象列表

x.employee.(@id > 300) // An XML list with both employee properties

//所有position子节点值包含“analyst”的employee对象列表

x.employee.(position.toString().search("analyst") > -1)

使用for ... in和for each ... in 语句

ActionScript 3.0 包括了一个新用来遍历XMLList对象的的for ... in语句和for each ... in语句。例如,考虑以下XML对象,myXML和myXML..item XMLList对象(包含两个item XML对象节点的XML列表):

var myXML:XML =

<order>

<item id=’1’ quantity=’2’>

<menuName>burger</menuName>

<price>3.95</price>

</item>

<item id=’2’ quantity=’2’>

<menuName>fries</menuName>

<price>1.45</price>

</item>

</order>

for ... in语句可以让我们遍历XMLList的所有属性名称,实际上就是个节点的索引值:

var total:Number = 0;

for (var pname:String in myXML..item)

{

total += Number(myXML.item.@quantity[pname]) * Number(myXML.item.price[pname]);

}

for each ... in语句遍历XMLList的所有节点:

var total2:Number = 0;

for each (var item:XML in myXML..item)

{

total2 += Number(item@quantity) * Number(item.price);

}

使用with语句

我们可以使用with语句,来指明后续的属性和节点值都是基于某一XML对象,前面的for each ... in示例代码,使用with语句的代码如下:

var total:Number = 0;

for each (var item in myXML..item)

{

with (item)

{

//{内的属性和节点对象都是基于item XML对象的,所有不需要使用item.来访问。

total += Number(@quantity) * Number(price);

}

}

trace(total);

修改XML对象

我们可以使用prependChild()方法或者appendChild()方法在XML对象的子节点列表的前面或者最后面添加节点:

var x1:XML = <p>Paragraph 1</p>

var x2:XML = <p>Paragraph 2</p>

var x:XML = <body></body>

x = x.appendChild(x1);

x = x.appendChild(x2

[1] [2] 下一页

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有