E4X用法简要
E4X语法是AS3对ECMAScript标准最前卫的实现,也是目前所有高级编程语言中操作XML最为方便的方式之一。仅仅因为AS3实现了E4X,作为程序员至少也应该了解它一下,因为它是那样的简洁、优雅。
因为AS3实现的是ECMAScript 357 for XML标准(ECMAScript对XML的扩展标准),简称为E4X。自有E4X以来,AS2程序员应该忘掉以前惯用的XMLDocument、 XMLNode、XMLParser 和 XMLTag。在AS3中,操作XML仅需要记住两个类:XML与XMLList。
主要概念:
元素(Element,或称为节点Node):XML 文档中的单个项目,它被标识为开始标签和结束标签之间包含的内容(包括标签)。XML 元素可以包含文本数据或其它元素,也可以为空。
属性 (Attribute):与元素关联的命名值,它以 attributename="value" 格式写入到元 素的开始标签中,而不是编写为嵌套在元素内的单独子元素。
设有如下XML:
var myXML:XML =
<order>
<item id='1' author='sban'>
<menuName>burger</menuName>
<price>3.95</price>
<title>as3 expert</title>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
var myXML:XML =
<order>
<item id='1' author='sban'>
<menuName>burger</menuName>
<price>3.95</price>
<title>as3 expert</title>
</item>
<item id='2'>
<menuName>fries</menuName>
<price>1.45</price>
</item>
</order>;
下面以实例讲解几个主要的E4X操作方法:
1,查找包括指定属性的元素列表
var items :XMLList = myXML.item.(hasOwnProperty('@author'));
var items :XMLList = myXML.item.(hasOwnProperty('@author'));
上例代码仅返回第一个item节点。
2,查找指定属性的值为X的元素列表
var items :XMLList = myXML.item.(@id == 1);
var items :XMLList = myXML.item.(@id == 1);
上例代码仅返回第一个item节点。
3,在查找条件中使用并、或、四则运算
var items :XMLList = myXML.item.(@id == 1 || @id == 2);
var items :XMLList = myXML.item.(@id == 1 && @id == 2);
var items :XMLList = myXML.item.(@id >= 1);
var items :XMLList = myXML.item.(@id == 1 || @id == 2);
var items :XMLList = myXML.item.(@id == 1 && @id == 2);
var items :XMLList = myXML.item.(@id >= 1);
4,查找含有指定节点名称的元素列表
var items :XMLList = myXML.item.(hasOwnProperty('title'));
var items :XMLList = myXML.item.(hasOwnProperty('title'));
5,如果有命名空间,在读取元素时必须加命名空间前缀
把用例XML修改为如下:
var myXML:XML =
<s:order xmlns:s="https://yishulun.com/as3expert">
<s:item id="1" author="sban">
<s:menuName>burger</menuName>
<s:price>3.95</price>
<s:title>as3 expert</title>
</s:item>
<s:item id="2">
<s:menuName>fries</menuName>
<s:price>1.45</price>
</s:item>
</s:order>;
var myXML:XML =
<s:order xmlns:s="https://yishulun.com/as3expert">
<s:item id="1" author="sban">
<s:menuName>burger</menuName>
<s:price>3.95</price>
<s:title>as3 expert</title>
</s:item>
<s:item id="2">
<s:menuName>fries</menuName>
<s:price>1.45</price>
</s:item>
</s:order>;
此时,问题1的答案便为:
var ns :Namespace = new Namespace("s", "https://yishulun.com/as3expert");
var items :XMLList = myXML.ns::item.(hasOwnProperty('@author'));
var ns :Namespace = new Namespace("s", "https://yishulun.com/as3expert");
var items :XMLList = myXML.ns::item.(hasOwnProperty('@author'));
其它操作与之类似。
6,如何向XMLList中推入一个元素
简单,使用加号:
items += <s:item id="3" xmlns:s="https://yishulun.com/as3expert">
<s:menuName>gumbo</menuName>
<s:price>2.45</price>
</s:item>;
items += <s:item id="3" xmlns:s="https://yishulun.com/as3expert">
<s:menuName>gumbo</menuName>
<s:price>2.45</price>
</s:item>;
7,如何从XMLList中删除一个元素
删除不能使用减号(why?),须使用delete关键字:
delete items.(@id == 1)[0];
delete不能作用于XMLList对象,操作对象必须是XML。
delete items.(@id == 1)[0];
delete不能作用于XMLList对象,操作对象必须是XML。
8,如何在XMLList中指定位置插入XML
先把XMLList包装为XML,然后使用XML的appendChild,prependChild,insertChildAfter,insertChildBefore方法实现。
9,如何获取子子节点列表或属性列表
var items :XMLList = myXML..ns::menuName;
var ids :XMLList = myXML..@id;
var items :XMLList = myXML..ns::menuName;
var ids :XMLList = myXML..@id;
2008年5月
2021更新:AS3原生支持的E4X语法,操作XML太方便了。现在跨系统数据交换基本都是使用json格式了,e4x这么好用的原生语法也很少使用了。