About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jul

    24

    在 E4X 语法中,XML 的转义字符有些特别。当这些字符用于属性、属生值、节点、节点值时需要用到转义的情况。其中左右大括号最为特别,因为在 E4X 中语法里,“绑定”语法使用的符号是左右大括号。

     

    Jul

    19

    先上一段代码:

    var novel:XML = <BOOK ISBN="0141182806">
                        <TITLE>Ulysses</TITLE>
                        <AUTHOR>Joyce, James</AUTHOR>
                        <PUBLISHER>Penguin Books Ltd</PUBLISHER>
                    </BOOK>;

    //生成 XMLList 引用部份文档
    var children:XMLList = novel.*;

    // 删除 <PUBLISHER>
    delete novel.PUBLISHER;

    trace(novel)
    // <BOOK ISBN="0141182806">
    // <TITLE>Ulysses</TITLE>
    // <AUTHOR>Joyce, James</AUTHOR>
    // </BOOK>
    trace("================");
    trace(children)
    // <TITLE>Ulysses</TITLE>
    // <AUTHOR>Joyce, James</AUTHOR>
    // <PUBLISHER>Penguin Books Ltd</PUBLISHER>
    // <PUBLISHER> 还是在的,没有受到前面 XML 对于节点删除的操作影响!

    当 XML 中的节点删除时,引用 XML 的 XMLList 并没有受到影响,看起来这部份引用是死的。接下来再看下一段代码:

    var novel:XML = <BOOK ISBN="0141182806">
                        <TITLE>Ulysses</TITLE>
                        <AUTHOR>Joyce, James</AUTHOR>
                        <PUBLISHER>Penguin Books Ltd</PUBLISHER>
                    </BOOK>;

    //生成 XMLList 引用部份文档
    var children:XMLList = novel.*;

    // 这里稍作修改,将原先的删除 <PUBLISHER> 改为值的修改
    novel.PUBLISHER = "HaHa";

    trace(novel)
    // <BOOK ISBN="0141182806">
    // <TITLE>Ulysses</TITLE>
    // <AUTHOR>Joyce, James</AUTHOR>
    // </BOOK>
    trace("================");
    trace(children)
    // <TITLE>Ulysses</TITLE>
    // <AUTHOR>Joyce, James</AUTHOR>
    // <PUBLISHER>Penguin Books Ltd</PUBLISHER>
    // <PUBLISHER>HaHa</PUBLISHER>

    两段代码其实是一模一样的,只是把前一段代码中的 delete 删除一个节点的操作,改为对节点值修改的操作。会发现这部份引用它是活的。

    按照 Colin Moock 《Essential ActionScript 3.0》中第 18 章 “18.9.6. References to Parts of a Document are Not Live”关于 XML 的说法:

    As you change or add new content to an XML object, bear in mind that any updates you make will not be reflected by variables that refer to part of that document.

    这句话仔细的翻译了一下,应该是理解成对于 XML 文档部份的引用是死的,对 XML 文档内容的修改或添加,它是不会反映到部份引用的 XMLList 对象中才对。虽然它里面有一句“Future versions of E4X may support live references to parts of a document.(意思是将来也许可能支持活的)”。

    但实际情况是我在最早的 FLASH CS3 中测试的结果和最新版本的 FLASH CC 版本测试的结果完全一样,也就是它从一开始到现在就是半死不活的……

    Jan

    3

    在 Flash 中常见的纯数据有 XML、JSON、Dictionary、以及其它字典类等等。然而,在 Flash AS3 中,本人强烈建义的,任何情况下都推荐使用 XML 数据类型。因为 FLASH AS3 是第一个这现 E4X 的语言(基于 ECMA-262 标准),而其它绝大部份编程语言都未实现这个标准。

    下面例举几个例子来说明 E4X 标准的好处(但不是全部,比如说点语法,这些JSON、Object、Dictionary 以及其它类在 AS3中都支持点语法,就不提它了):

    1、XML 数据支持花括号{}绑定语法

    AS3 在生成 XML 对象时,可以使用花括号{}绑定语法, 无需遍历 / 枚举,或多次使用点语法来添加属性或节点值,一次性生成所有节点属性和节点值、以及子节点等等。

    2、XML / XMLList 是有序对象

    有序对象意味着在使用 for each...in 等快速枚举时拥有固定的顺序,每个子节点拥有自己的索引值。而其它对象在添加或删除键-值时,输出顺序并不能保证一致顺序结果。

    3、允许使用俩个点号 .. 后裔操作符

    在对孩子节点、孙子节点、曾孙子节点……这些后裔节点操作时,使用 .. 后裔操作符,极其方便以及高性能(C++ 极别),而其它对象需要使用 AS 循环遍历 AVM / 虚拟机级别。

    4、允许使用过滤谓词运算符

    获取数据后,最多的操作过程可能就是查询数据,E4X 提供了类似 SQL 语言查询的强大过滤谓词运算符,极其方便以及高性能(C++ 极别),而其它对象需要使用 AS 循环遍历 AVM / 虚拟机级别。

    5、强大的命名空间机制

    原生的 XML 标准命名空间机制完全兼容于 AS3 的 XML 数据对象。

    但有情况的例外:即在获取数据后,无需任何对“值”(非键)的查询操作,以及无需有序的节点索引操作,只有在这两种情况下才推荐使用其它类型的数据。

    Jan

    18

    样例代码:

    var rootElementName:String = "BOOK";
    var rootAttributeName:String = "ISBN";
    var childElementNames:Array = ["TITLE", "AUTHOR", "PUBLISHER"];
    var bookISBN:String = "0141182806";
    var bookTitle:String = "Ulysses";
    var bookAuthor:String = "Joyce, James";
    var bookPublisher:String = "Penguin Books Ltd";
    var novel:XML = <{rootElementName} {rootAttributeName}={bookISBN}>
    <{childElementNames[0]}>{bookTitle}</{childElementNames[0]}>
    <{childElementNames[1]}>{bookAuthor}</{childElementNames[1]}>
    <{childElementNames[2]}>{bookPublisher}</{childElementNames[2]}>
    </{rootElementName}>;

    以上样例代码与以下资料摘自《 Essential ActionScript 3.0 》:

    Note that because the characters { and } are used to delimit a dynamic expression, they are not allowed in some parts of an XML literal. Specifically, within an element name, an attribute name, or element content, the entities &#x7B; and &#x7D; must be used to represent { and }, respectively. However, { and } can be used in literal form within an attribute value, a CDATA section, a processing instruction, or a comment.

    More...

    Dec

    19

    Oct

    31

    ActionScript3 支持了E4X标准来处理XML数据,非常方便;但在ActionScript2 中只能使用DOM标准来处理XML数据(事实上ActionScript3 支持两种标准来处理XML数据,除了E4X之外,仍然支持传统的DOM标准来处理XML数据)。以下为XML数据解析方法的实例截图:

    Jan

    20

    要求:从一个静态的二维数组动态生成如图所示的XML节点(一般用于目录树结构)


    提示:每个元素都有自带的属性(图中用黑色的1、2、3、4……表示),所以元素不能进行位置重排,读取数组元素时按从左向右的顺序读取;其中每个元素的层级深度已知的(图中用红色的0、1、2、3、4……表示)。

    //需要解析成XML的静态数组(样例数组)
    var dataArray:Array = [["A1", 0], ["B1", 1], ["C1", 2], ["B2", 1], ["C2", 2], ["C3", 2], ["D1", 3], ["D2", 3], ["E1", 4], ["B3", 1], ["A2", 0], ["B4", 1], ["B5", 1]];
    //创建空XML实例,这里是AS3版本为例(如果是AS2版本,将XMLDocument类改为XML类即可)
    var xml:XMLDocument = new XMLDocument();
    //根元素
    var root_node = xml.createElement("root");
    //将根元素添加到XML树
    xml.appendChild(root_node);
    //最近一次层级深度
    var last_level:Number = 0;
    //当前节点引用
    var node:XMLNode = xml.firstChild;
    for (var n:Number = 0; n<dataArray.length; n++) {
        //当前层级深度
        var now_level:Number = dataArray[n][1];
        //元素名称
        var element=dataArray[n][0];
        //当前节点元素
        var element_node = xml.createElement(dataArray[n][0]);
        //一个参数用以对比当前元素层级深度与上一次元素层级深度作为对比
        var distance_level:Number = now_level-last_level;
        //
        if (distance_level>0) {
            //如果大于0就成为子节点
            node = node.lastChild;
        } else if (distance_level == 0) {
            //等于0作为并列节点
            node = node.parentNode.lastChild;
        } else {
            //小于0就成为某个父节点的并列节点
            while (distance_level++<0) {
                node = node.parentNode;
            }
        }
        last_level = now_level;
        node.appendChild(element_node);
    }
    trace(xml);

     

    Apr

    26

    一般中文的XML文档如使用的为全角标点符号则无关紧要,少数英文的XML文档可能需要用上。

     以下半角符号会被为是XML的关键标识符,需要转义字符(连同分号),“<,>,&,',"”: 

    &lt; < 小于
    &gt; > 大于
    &amp; & 和号
    &apos; ' 省略号
    &quot; " 引号

    注:严格的讲,只有“<”和“&”需要转义字符,而单引号,双引号,大于号是合法的。

    还有一种方法,是使用CDATA标签(部件):以“<![CDATA[”标记开始,以“]]>”标记结束。所有在CDATA标签之间的文本,包括所有XML文件关键标识符都会被解析器忽略。