博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高程3总结#第19章E4X
阅读量:6436 次
发布时间:2019-06-23

本文共 5401 字,大约阅读时间需要 18 分钟。

E4X

E4X的类型

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

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

XMl类型

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

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

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

    var employee = 
    Nicholas C. Zakas
    ;

XMLList类型

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

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

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

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

    var list=<>

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); //undefinedalert(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 = 
    Nicholas C. Zakas
    Jim Smith
    ;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()); //truealert(employees.employee[0].hasSimpleContent()); //falsealert(employees.employee[0].name.hasComplexContent()); //falsealert(employees.employee[0].name.hasSimpleContent()); //true

查询

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

    var allDescendants = employees.descendants(); //所有后代节点var allNames = employees.descendants("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}
    ;alert(xml.toXMLString()); //"
    red
  • 类似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 = 
    Nicholas C. Zakas
    Jim Smith
    ;employees.appendChild(
    Benjamin Anderson
    ); employees.prependChild(
    Michael Johnson
    ); employees.insertChildBefore(employees.child(2),
    Margaret Jones
    );employees.setChildren(
    Richard McMichael
    +
    Rebecca Smith
    );

解析和序列化

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

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

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

命名空间

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

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

其他变化

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

    var employees = 
    Nicholas C. Zakas
    Jim Smith
    ;for each (var child in employees){ alert(child.toXMLString());}

前面启用E4X

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

转载地址:http://pahga.baihongyu.com/

你可能感兴趣的文章
用Chrome开发者工具调试一切
查看>>
简易mvvm库的设计实现
查看>>
AppDynamics把业务交易跟踪扩展到SAP环境
查看>>
[Three.js]Three.js中文文档-自定义混合方程常数
查看>>
Kafka 处理器客户端介绍
查看>>
通过分析这段代码的进化历程,或许能够加深您对JavaScript的作用域的理解
查看>>
创建对象(一):创建与继承
查看>>
深入浅出vue1.0:Vue 实例
查看>>
XML 实体扩展攻击
查看>>
浅谈 OneAPM 在 express 项目中的实践
查看>>
kubernetes节点选择器
查看>>
Sublime Text 3初体验
查看>>
快速排序&归并排序
查看>>
将字符串转换成二维码
查看>>
AsyncTask的小分析
查看>>
使用Redis实现关注关系
查看>>
Go抓取网页数据并存入MySQL和返回json数据<三>
查看>>
MySQL复制介绍及搭建
查看>>
Java在线调试工具
查看>>
[译]CSS-理解百分比的background-position
查看>>