`
全能骑士
  • 浏览: 67231 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

flex处理XML(一)基础

    博客分类:
  • FLEX
阅读更多
FLEX处理XML,ECMAScript For XML(e4x)

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>



trace(myXML.item[0].menuName); // 输出:burger
trace(myXML.item.(@id==2).menuName); // 输出:fries
trace(myXML.item.(menuName=="burger").price); // 输出:3.95


使用 appendChild() 方法可为 XML 分配一个新的子节点

使用 @ 和 . 运算符不仅可以读取数据,还可以分配数据,如下所示:
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";


使用 for 循环可以循环访问 XML 的节点,如下所示:
var total:Number = 0;
for each (var property:XML in myXML.item)
{
var q:int = Number(property.@quantity);
var p:Number = Number(property.price);
…..
{
trace("Total: $", total.toFixed(2));




可将 XML 文本赋予 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 str:String = "<order><item id='1'><menuName>burger</menuName>"
+ "<price>3.95</price></item></order>";
var myXML:XML = new XML(str);




要从 URL 加载 XML 数据,请使用 URLLoader 类,如下面的示例所示:
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
var externalXML:XML;
var loader:URLLoader = new URLLoader();
var request:URLRequest = new URLRequest("xmlFile.xml");
loader.load(request);
loader.addEventListener(Event.COMPLETE, onComplete);
function onComplete(event:Event):void
{
var loader:URLLoader = event.target as URLLoader;
if (loader != null)
{
externalXML = new XML(loader.data);
trace(externalXML.toXMLString());
}
else
{
trace("loader is not a URLLoader!");
}
}

使用 prependChild() 方法或 appendChild() 方法可在 XML 对象属性列表的开头或结尾
添加属性,如下面的示例所示:
var x1:XML = <p>Line 1</p>
var x2:XML = <p>Line 2</p>
var x:XML = <body></body>
x = x.appendChild(x1);
x = x.appendChild(x2);
x = x.prependChild(<p>Line 0</p>);
// x == <body><p>Line 0</p><p>Line 1</p><p>Line 2</p></body>

使用 insertChildBefore() 方法或 insertChildAfter() 方法在指定属性之前或之后添加
属性,如下所示:
var x:XML =
<body>
<p>Paragraph 1</p>
<p>Paragraph 2</p>
</body>
var newNode:XML = <p>Paragraph 1.5</p>
x = x.insertChildAfter(x.p[0], newNode)
x = x.insertChildBefore(x.p[2], <p>Paragraph 1.75</p>)
如下面的示例所示,还可以使用大括号运算符({ 和 })在构造 XML 对象时按引用(从其
它变量)传递数据:
var ids:Array = [121, 122, 123];
var names:Array = [["Murphy","Pat"], ["Thibaut","Jean"], ["Smith","Vijay"]]
var x:XML = new XML("<employeeList></employeeList>");
for (var i:int = 0; i < 3; i++)
{
var newnode:XML = new XML();
newnode =
<employee id={ids[i]}>
<last>{names[i][0]}</last>
<first>{names[i][1]}</first>
</employee>;
x = x.appendChild(newnode)
}
可以使用 = 运算符将属性 (property) 和属性 (attribute) 赋予 XML 对象,如下所示:
var x:XML =
<employee>
<lastname>Smith</lastname>
</employee>
x.firstname = "Jean";
x.@id = "239";
这将对 XML 对象 x 进行如下设置:
<employee id="239">
<lastname>Smith</lastname>
<firstname>Jean</firstname>
</employee>

可以使用 + 和 += 运算符连接 XMLList 对象:
var x1:XML = <a>test1</a>
var x2:XML = <b>test2</b>
var xList:XMLList = x1 + x2;
xList += <c>test3</c>


这将对 XMLList 对象 xList 进行如下设置:
<a>test1</a>
<b>test2</b>
<c>test3</c>


myXML.book 是一个 XMLList 对象,它包含名为 book 的 myXML 对象的子属性。
myXML..lastName 是一个 XMLList 对象,它包含名为 lastName 的任何后代属性。


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) // 输出:Dictionary


使用 @ 符号(属性标识符运算符)可以访问 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 是首选方法。


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

遍历 XML 结构以下表达式都是有效的:
■ 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。

如果试图按照可能不存在的属性或元素过滤,Adobe Flash Player 将引发异常。例如,以下
代码的最后一行产生一个错误,因为第二个 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'));



ActionScript 3.0 包含用于循环访问 XMLList 对象的 for..in 语句和 for each..in 语
句。例如,我们来看 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;
}
分享到:
评论

相关推荐

    Flex学习大礼包(flex基础教程、flex和java整合)--下载不扣分,童叟无欺

    下载不扣分,回帖加1分。 此压缩包, 【包括】 1&gt;一套Flex基础教程的PPT。 2&gt;FLEX和JAVA整合的技术文档。 【适用于】 1&gt;FLEX入门 ...│ 在eclipse 的一个项目中同时开发j2ee模块和flex 客户端模块.doc │

    flex平台设计说明书

    flex平台设计说明书,基础技术架构。新增了BaseBusiness 和BaseServlet,其他各层也有较多改动,箭头方向表示在层次之间的返回值类型,比如,Business里的方法返回String或Bool值(由于有平台常数,所有的返回值都是...

    flex3的cookbook书籍完整版dpf(包含目录)

    如何处理XML服务里所返回的命名空间 19.8节. 将ActionScript 数据对象编码成XML 19.9节. 使用复杂XML数据来填充组件 19.10节. 从Web服务中把XML译码成为强类型对象 第二十章与浏览器通信(628) 20.1节连接到外部URL ...

    gsoap 2.8 (SOAP/XML 关于C/C++ 语言的自动化实现工具内附 CSharp webservice例子,及GSOAP client和server例子)

    gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户...

    基于Asp.net和Flex的网络硬盘源码

    基于Asp.net和Flex的网络硬盘源码 可以实现多用户管理,进行用户注册,创建文件夹和文件上传 smark.data是基于C#开发的轻量级数据访问组件。 提供以下功能封: 1)提供了跨数据库类型操作能力 2)基于程线存储的数据...

    ActionScript开发人员指南中文版

    用于处理XML的EX方法 XML对象 XMLList对象 初始化XML变量 组合和变换XML对象 遍历XML结构 使用XML命名空间 XML类型转换 读取外部XML文档 在ActionScript中使用XML的示例:从Internet加载RSS数据 第章:使用本机JSON...

    Flash ActionScript 3.0学习指南

    全书内容包括ActionScript 3.0 语言介绍、ActionScript3.0基本语法、事件机制、面向对象、数组、正则表达式、XML应用、常用的内置类、基本组件、数据列表组件、 DataGrid组件、文本处理、绘图、几何结构、音频、视频...

    Maven权威指南 很精典的学习教程,比ANT更好用

    Maven权威指南是一本关于Apache Maven的书。 Copyright 1. Creative Commons BY-ND-NC Foreword: Beta 0.16 Preface 1. How to Use this Book 2. Your Feedback 3. Font Conventions 4. Maven Writing ...

    asp.net知识库

    技术基础 New Folder 多样式星期名字转换 [Design, C#] .NET关于string转换的一个小Bug Regular Expressions 完整的在.net后台执行javascript脚本集合 ASP.NET 中的正则表达式 常用的匹配正则表达式和实例 经典正则...

    ActionScript开发技术大全

    13.2处理XML数据 283 13.2.1初始化XML对象 283 13.2.2访问与遍历 285 13.3XML对象 288 13.3.1XML对象的数据处理方式 288 13.3.2处理子节点 289 13.3.3访问XML数据 293 13.3.4处理命名空间 294 13.4网络图片加载器...

    wap网站和wap+2.0教程.

     WML是以XML为基础的标记语言,用在规范窄频设备,如手机、呼叫器等如何显示内容和使用者接口的语言。因为窄频使得WML受到部分限制,如较小型的显示器、有限的使用者输入设备、窄频网络联机、有限的内存和资源等。 ...

    Spring攻略(第二版 中文高清版).part2

    14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...

    Spring攻略(第二版 中文高清版).part1

    14.1 用Spring Portlet MVC开发一个简单的Portlet 544 14.1.1 问题 544 14.1.2 解决方案 545 14.1.3 工作原理 546 14.2 将Portlet请求映射到处理程序 553 14.2.1 问题 553 14.2.2 解决方案 553 14.2.3...

Global site tag (gtag.js) - Google Analytics