高程3总结#第19章E4X

E4X

E4X的类型

  • E4X定义了几个新的全局类型

    • XML,XML结构中的任何一个独立的部分
    • XMLList,XML对象的集合
    • Namespace,命名空间前缀与命名空间URI之间的映射
    • QName,由内部名称和命名空间URI组成的一个限定名

XMl类型

  • 创建XML对象的方式不止一种,第一种方式是像下面这样调用其构造函数

    var x=new XML();
  • 这行代码会创建一个空的XML对象,我们能够向其中添加数据,也可以向构造函数中传入一个XML字符串

    var x = new XML("<employee position=\"Software Engineer\"><name>Nicholas " + "Zakas</name></employee>");
  • 使用XML字面量将XML数据直接指定给一个变量,XML字面量就是嵌入到JavaScript代码中的XML代码

    var employee = <employee position="Software Engineer"><name>Nicholas C. Zakas</name></employee>;

XMLList类型

  • XMLList类型表现XML对象的有序集合,XMLList的DOM对等类型是NodeList,但与Node和NodeList之间的区别相比,XML和XMLList之间的区别是有意设计的比较小的

    var list=new XMLList();
  • 与XML构造函数一样,也可以向其中传入一个待解析的XML字符串,这个字符串可以不止包含一个文档元素

    var list=new XMLList("<item/><item/>");
  • 还可以使用加号操作符来组合两个或多个XML对象,从而创建XMLList对象

    var list=<item/>+<item/>;
  • 同样的组合操作也可以使用特殊的<>和</>语法来完成,此时不适用加号操作符

    var list=<><item/><item/></>

Namespace类型

  • 要创建Namespace对象,可以像下面这样使用Namespace构造函数

    var ns=new Namespace();
  • 而传入URI或前缀加URI,就可以初始化Namespace对象

    var ns = new Namespace("http://www.wrox.com/"); //没有前缀的命名空间
    var wrox = new Namespace("wrox", "http://www.wrox.com/"); //wrox 命名空间
  • 可以使用prefix和uri属性类取得Namespace对象中的信息

    alert(ns.uri); //"http://www.wrox.com/"
    alert(ns.prefix); //undefined
    alert(wrox.uri); //"http://www.wrox.com/"
    alert(wrox.prefix); //"wrox"

QName类型

  • 向QName构造函数中传入名称或Namespace对象和名称,可以手工创建新的QName对象

    var wrox = new Namespace("wrox", "http://www.wrox.com/");
    var wroxMessage = new QName(wrox, "message"); //表示"wrox:message"
  • 创建QName对象之后,可以访问它的两个属性,uri和localName,其中uri属性返回在创建对象时指定的命名空间URI,而localName属性返回限定名中的内部名称

    alert(wroxMessage.uri); //"http://www.wrox.com/"
    alert(wroxMessage.localName); //"message"

一般用法

访问特性

  • 访问特性可以使用点语法,为了区分特性名与子元素的标签名,必须在名称前面加上一个@字符

    var employees = <employees>
        <employee position="Software Engineer">
          <name>Nicholas C. Zakas</name>
    </employee>
    <employee position="Salesperson">
      <name>Jim Smith</name>
    </employee>
    </employees>;
    alert(employees.employee[0].@position); //"Software Engineer"

其他节点类型

  • 默认情况下,E4X不会解析注释或处理指令,因此这些部分不会出现在最终的对象层次中,如果想让解析器解析这些部分,可以设置XML构造函数的两个属性

    XML.ignoreComments = false;
    XML.ignoreProcessingInstructions = false;
  • 设置了两个属性之后,E4X就会将注释和处理指令解析到XML结构中
  • 使用nodeKind()方法可以得到XML对象表示的类型,该访问可能会返回"text"、"element"、"comment"、"processinginstruction"、"attribute"
    图片描述
  • 只取得特定类型的节点

    • attribute(),返回XML对象的所有特性
    • comments(),返回XML对象的所有子注释节点
    • elements(),返回XML对象的所有子元素,可以通过提供元素的tagName来过滤想要的返回的结果
    • processingInstructions(),返回XML对象的所有处理指令,可以通过提供处理指令的name来过滤想要的返回的结果
    • text(),返回XML对象的所有文本子节点
  • 使用 hasSimpleContent() 和 hasComplexContent() 方法,可以确定 XML 对象中是只包含文本,还是包含更复杂的内容。如果 XML 对象中只包含子文本节点,则前一个方法会返回 true ;如果 XML 对象的子节点中有任何非文本节点,则后一个方法返回 true 。

    alert(employees.employee[0].hasComplexContent()); //true
    alert(employees.employee[0].hasSimpleContent()); //false
    alert(employees.employee[0].name.hasComplexContent()); //false
    alert(employees.employee[0].name.hasSimpleContent()); //true

查询

  • 同样的查询可以使用 descendants() 方法来完成。在不给这个方法传递参数的情况下,它会返回所有后代节点(与使用 ..* 相同),而传递一个名称作为参数则可以限制结果。

    var allDescendants = employees.descendants(); //所有后代节点
    var allNames = employees.descendants("name"); //后代中的所有<name/>元素
  • 还可以取得所有后代元素中的所有特性,方法是使用下列任何一行代码。

    var allAttributes = employees..@*; //取得所有后代元素中的所有特性
    var allAttributes2 = employees.descendants("@*"); //同上
  • 与限制结果中的后代元素一样,也可以通过用完整的特性名来替换星号达到过滤特性的目的。

    var allAttributes = employees..@position; //取得所有 position 特性
    var allAttributes2 = employees.descendants("@position"); //同上

构建和操作XML

  • 使用花括号,可以将JavaScript变量嵌入到字面量中的任意位置

    var tagName = "color";
    var color = "red";
    var xml = <{tagName}>{color}</{tagName}>;
    alert(xml.toXMLString()); //"<color>red</color>
  • 类似DOM的方法

    • appendChild(child),将给定的 child 作为子节点添加到 XMLList 的末尾。
    • copy(),返回 XML 对象副本。
    • insertChildAfter(refNode, child),将 child 作为子节点插入到 XMLList 中 refNode 的后面。
    • insertChildBefore(refNode, child),将 child 作为子节点插入到 XMLList 中 refNode 的前面。
    • prependChild(child),将给定的 child 作为子节点添加到 XMLList 的开始位置。
    • replace(propertyName, value),用 value 值替换名为 propertyName 的属性,这个属性可能是一个元素,也可能是一个特性。
    • setChildren(children),用 children 替换当前所有的子元素, children 可以是 XML 对象,也可是 XMLList 对象。
    var employees = <employees>
        <employee position="Software Engineer">
          <name>Nicholas C. Zakas</name>
    </employee>
    <employee position="Salesperson">
      <name>Jim Smith</name>
    </employee>
    </employees>;
    employees.appendChild(<employee position="Vice President">
                          <name>Benjamin Anderson</name>
                          </employee>);
                          employees.prependChild(<employee position="User Interface Designer">
                          <name>Michael Johnson</name>
                          </employee>);
                          employees.insertChildBefore(employees.child(2),
      <employee position="Human Resources Manager">
        <name>Margaret Jones</name>
    </employee>);
    employees.setChildren(<employee position="President">
                          <name>Richard McMichael</name>
                          </employee> +
                          <employee position="Vice President">
                          <name>Rebecca Smith</name>
                          </employee>);

解析和序列化

  • 与XML解析相关的设置有三个

    • ignoreComments,表示解析器应该忽略标记中的注释。默认设置为 true 。
    • ignoreProcessingInstructions,表示解析器应该忽略标记中的处理指令。默认设置为 true 。
    • ignoreWhitespace ,表示解析器应该忽略元素间的空格,而不是创建表现这些空格的文本节点。默认设置为 true 。
  • XML数据序列化相关的设置

    • prettyIndent ,表示在序列化 XML 时,每次缩进的空格数量。默认值为 2。
    • prettyPrinting,表示应该以方便人类认读的方式输出 XML,即每个元素重起一行,而且子元素都要缩进。默认设置为 true 。

命名空间

  • 通过使用setNamespace()并传入Namespace对象,也可以给定元素设置命名空间

    var messages = <messages>
        <message>Hello world!</message>
    </messages>;
    messages.setNamespace(new Namespace("wrox", "http://www.wrox.com/"));

其他变化

  • 引入了for-each-in循环,以便迭代遍历每一个属性并返回属性的值

    var employees = <employees>
        <employee position="Software Engineer">
          <name>Nicholas C. Zakas</name>
    </employee>
    <employee position="Salesperson">
      <name>Jim Smith</name>
    </employee>
    </employees>;
    for each (var child in employees){
      alert(child.toXMLString());
    }

前面启用E4X

  • 要想完整地启用E4X,需要将<script>标签的type特性设置为"text/javascript;e4x=1"

    <script type="text/javascript;e4x=1" src="e4x_file.js"></script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值