Skip to content

🔰 E4X用法简要

🕒 Published at:

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。

主要概念:

  1. 元素(Element,或称为节点Node):XML 文档中的单个项目,它被标识为开始标签和结束标签之间包含的内容(包括标签)。XML 元素可以包含文本数据或其它元素,也可以为空。

  2. 属性 (Attribute):与元素关联的命名值,它以 attributename="value" 格式写入到元 素的开始标签中,而不是编写为嵌套在元素内的单独子元素。

设有如下XML:

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,查找包括指定属性的元素列表

js
var items :XMLList = myXML.item.(hasOwnProperty('@author'));
var items :XMLList = myXML.item.(hasOwnProperty('@author'));

上例代码仅返回第一个item节点。

2,查找指定属性的值为X的元素列表

js
var items :XMLList = myXML.item.(@id == 1);
var items :XMLList = myXML.item.(@id == 1);

上例代码仅返回第一个item节点。

3,在查找条件中使用并、或、四则运算

js
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,查找含有指定节点名称的元素列表

js
 var items :XMLList = myXML.item.(hasOwnProperty('title'));
 var items :XMLList = myXML.item.(hasOwnProperty('title'));

5,如果有命名空间,在读取元素时必须加命名空间前缀

把用例XML修改为如下:

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的答案便为:

js
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中推入一个元素

简单,使用加号:

xml
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,如何获取子子节点列表或属性列表

js
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这么好用的原生语法也很少使用了。