as3比as2处理xml的功能增强了N倍,获取或遍历节点非常之方便,类似于json对像的处理方式。

XML 的一个强大功能是它能够通过文本字符的线性字符串提供复杂的嵌套数据。将数据加载到 XML 对象时,ActionScript 会分析数据并将其分层结构加载到内存(如果 XML 数据格式有误,它会发送运行时错误)。

利用 XML 和 XMLList 对象的运算符和方法可以轻松遍历 XML 数据的结构。

1、读取外部 XML 文档

可以使用 URLLoader 类从 URL 加载 XML 数据。若要在应用程序中使用以下代码,请将示例中的 XML_URL 值替换为有效的 URL:

var myXML:XML = new XML();
var XML_URL:String = "http://www.87cool.com/sitemap.xml";
var myXMLURL:URLRequest = new URLRequest(XML_URL);
var myLoader:URLLoader = new URLLoader(myXMLURL);
myLoader.addEventListener("complete", xmlLoaded);

function xmlLoaded(event:Event):void
{
myXML = XML(myLoader.data);
trace("Data loaded.");
}

2、使用点 (.) 运算符和后代存取器 (..) 运算符

使用点 (.) 运算符和后代存取器 (..) 运算符可以访问 XML 对象的子属性。参考下面的 XML 对象:

var myXML:XML = 
<order>
<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>对象 myXML.book 是一个 XMLList 对象,它包含名为 book 的 myXML 对象的子属性。它们是两个 XML 对象,与 myXML 对象的两个 book 属性匹配。

对象 myXML..lastName 是一个 XMLList 对象,该对象包含名为 lastName 的所有后代属性。它们是两个 XML 对象,与 myXML 对象的两个 lastName 匹配。

myXML.book.editor.lastName 对象是一个 XMLList 对象,它包含 myXML 对象的名为 book 的子对象的名为 editor 的子对象的名为 lastName 的所有子对象:在本例中,XMLList 对象只包含一个 XML 对象(值为 "Case" 的 lastName 属性)。

3、访问父节点和子节点

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

可以使用子级列表的序数索引值访问特定的子对象。例如,假设 XML 对象 myXML 有两个名为 book 的子属性。每个名为 book 的子属性都有一个与之关联的索引编号:

myXML.book[0]
myXML.book[1]

要访问特定的孙项,可为子项和孙项名称同时指定索引编号:

myXML.book[0].title[0]

不过,如果 x.book[0] 只有一个子项名为 title ,则可以省略索引引用,如下所示:

myXML.book[0].title

同样,如果对象 x 只有一个 book 子对象,并且如果该子对象只有一个 title 对象,则可以同时省略两个索引引用,如下所示:

myXML.book.title

可以使用 child() 方法导航到名称基于变量或表达式的子项,如下面的示例所示:

var myXML:XML = 
<order>
<book>
<title>Dictionary</title>
</book>
</order>;

var childName:String = "book";

trace(myXML.child(childName).title) // output: Dictionary

4、访问属性

使用 @ 符号(属性标识符运算符)可以访问 XML 或 XMLList 对象的属性,如下面的代码所示:

var employee:XML = 
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.@id); // 6401

可以一起使用 * 通配符和 @ 符号来访问 XML 或 XMLList 对象的所有属性,如下面的代码所示:

var employee:XML = 
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.@*.toXMLString()); 
// 6401
// 233

可以使用 attribute() 或 attributes() 方法访问 XML 或 XMLList 对象的特定属性或所有属性,如下面的代码所示:

var employee:XML = 
<employee id="6401" code="233">
<lastName>Wu</lastName>
<firstName>Erin</firstName>
</employee>;
trace(employee.attribute("id")); // 6401
trace(employee.attribute("*").toXMLString()); 
// 6401
// 233
trace(employee.attributes().toXMLString()); 
// 6401
// 233

请注意,还可以使用以下语法访问属性,如下面的示例所示:

employee.attribute("id")
employee["@id"]
employee.@["id"]其中每一个都等效于 employee.@id . 但是,语法 employee.@id 是首选方法。

5、按属性或元素值过滤

可以使用括号运算符 — ( 和 ) — 过滤具有特定元素名称或属性值的元素。请考虑下面的 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>
以下表达式都是有效的:

x.employee.(lastName == "McGee") — 这是第二个 employee 节点。

x.employee.(lastName == "McGee").firstName — 这是第二个 employee 节点的 firstName 属性。

x.employee.(lastName == "McGee").@id — 这是第二个 employee 节点的 id 属性的值。

x.employee.(@id == 347) — 第一个 employee 节点。

x.employee.(@id == 347).lastName — 这是第一个 employee 节点的 lastName 属性。

x.employee.(@id > 300) — 这是具有两个 employee 属性的 XMLList。

x.employee.(position.toString().search("analyst") > -1) — 这是具有两个 position 属性的 XMLList。

如果试图按照可能不存在的属性或元素过滤,则 Flash? Player 和 Adobe? AIR? 将引发异常。例如,以下代码的最后一行产生一个错误,因为第二个 p 元素中没有 id 属性:

var doc:XML = 
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(@id == '123'));

同样,以下代码的最后一行也会产生一个错误,因为第二个 p 元素没有 b 属性:

var doc:XML = 
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(b == 'Bob'));

为了避免这些错误,可以使用 attribute() 和 elements() 方法来识别具有匹配属性或元素的属性,如下面的代码所示:

var doc:XML = 
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(attribute('id') == '123'));
trace(doc.p.(elements('b') == 'Bob'));

还可以使用 hasOwnProperty() 方法,如下面的代码所示:

var doc:XML = 
<body>
<p id='123'>Hello, <b>Bob</b>.</p>
<p>Hello.</p>
</body>;
trace(doc.p.(hasOwnProperty('@id') && @id == '123'));
trace(doc.p.(hasOwnProperty('b') && b == 'Bob'));

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

ActionScript 3.0 包含 for..in 语句和 for each..in 语句,用于遍历 XMLList 对象。例如,我们来看 XML 对象 myXML 和 XMLList 对象 myXML.item 。XMLList 对象 myXML.item 由 XML 对象的两个 item 节点组成。

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 += myXML.item.@quantity[pname] * myXML.item.price[pname];
}

for each..in 语句用于遍历 XMLList 中的属性:

var total2:Number = 0;
for each (var prop:XML in myXML.item)
{
total2 += prop.@quantity * prop.price;
}

[ActionScript 3.0] as3处理xml的功能和遍历节点的更多相关文章

  1. [ActionScript 3.0] AS3 对XML的操作,创建、删除、增加节点方法

    package { import flash.display.Sprite; /** * @author:Frost.Yen * @E-mail:871979853@qq.com * @create: ...

  2. [ActionScript 3.0] AS3 实现XML转换成JSON

    package com.fylib.util { /** * @author Frost.Yen * @E-mail 871979853@qq.com * @create 2015-6-18 下午2: ...

  3. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  4. [ActionScript 3.0] AS3.0 生成xml方法之一

    var type:Array = ["type0", "type1", "type2"]; var property:Array = [[& ...

  5. [ActionScript 3.0] AS3.0 涂鸦及擦除功能,撤销重做步骤记录实例

    package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.BlendMo ...

  6. [ActionScript 3.0] AS3.0 复制xml,并赋值

    var template:XML= <person><name><first>FIRST</first><last /></name& ...

  7. [ActionScript 3.0] AS3 深入理解Flash的安全沙箱Security Domains

    简介 如果你还没有与复杂的的安全域(security domain)和应用程序域(application domain)问题打过交道,那么你真是个幸运的家伙.当你在加载外部内容(然后他们开始播放)的时 ...

  8. [ActionScript 3.0] AS3 深入理解Flash的 应用程序域Application Domains

    简介 网上有很多flash,通常都不需要显示的使用应用程序域,因为默认的应用程序域就够用了.其实复杂的情况下需要用到应用程序域,比如说有两个不同的swf,一个是旧版本的,一个是新版的,这两个文件里的类 ...

  9. [ActionScript 3.0] AS3调用百度天气预报查询API

    接口说明 根据经纬度/城市名查询天气的结果 接口示例 http://api.map.baidu.com/telematics/v3/weather?location=成都&output=jso ...

随机推荐

  1. unity中的构造函数

    避免使用构造函数 不要在构造函数中初始化任何变量,使用Awake或Start实现这个目的.即使是在编辑模式中Unity也自动调用构造函数,这通常发生在一个脚本被编译之后,因为需要调用构造函数来取向一个 ...

  2. 利用Delphi-cross-socket 库提升kbmmw 跨平台开发

    以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...

  3. swift-基础语法2

    一.整形 :有符号和无符号类型 有符号类型:Int ,Int8 ,Int32,Int64 无符号类型: UInt ,UInt8 UInt32,UInt64 注意点:如果你的开发环境是32位,那么Int ...

  4. Python脚本语言第一行的写法

    脚本语言的第一行,目的就是指出,你想要你的这个文件中的代码用什么可执行程序去运行它,就这么简单 #!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python ...

  5. 2018.10.27 codeforces402D. Upgrading Array(数论+贪心)

    传送门 唉我觉得这题数据范围1e5都能做啊... 居然只出了2000 考完听zxyzxyzxy说我的贪心可以卡但过了? 可能今天本来是0+10+00+10+00+10+0只是运气好T1T1T1骗了10 ...

  6. linux利用命令将一个盘上的所有复制到另一个盘上

    1.fdisk -l 查看硬盘状况 2.将目标盘利用mount挂载 3.查看硬盘使用状况,看目标盘是否有足够的空间:df -h 4.如果足够,利用dd命令将源盘数据拷贝到目标盘:dd if=/dev/ ...

  7. php代码记录

    公司项目的随想记录也记在这里: 1,证书产生的目的是为了防止不合法的用户能够直接访问接口获取数据.证书由服务器端生成,然后返回给app.然后app拿着这个证书到服务器端获取接口数据,而不是app的合法 ...

  8. mysql学习之路_事物_存储过程_备份

    数据备份与还原 备份:将当前已有的数据保留. 还原:将已经保留的数据恢复到对应表中 为什么要做数据备份 1,防止数据丢失,被盗,误操作 2,保护数据记录 数据备份还原方式有多种:数据表备份 单表数据备 ...

  9. embeded_2_separate_sync

    //如果是8位的话,只选择低8位传输 //因为同步码也是可以自己设置,所以把同步码设置成parameter最好 module embeded_2_separate_sync( input clk, : ...

  10. AngularJS实战之路由ui-view传参

    angular路由传参 首页 <!DOCTYPE html> <html ng-app="app"> <head> <title>路 ...