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
其他节点类型
-
默认情况下,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 Benjamin Anderson Michael Johnson Margaret Jones Richard McMichael Rebecca Smith
解析和序列化
-
与XML解析相关的设置有三个
- ignoreComments,表示解析器应该忽略标记中的注释。默认设置为 true 。
- ignoreProcessingInstructions,表示解析器应该忽略标记中的处理指令。默认设置为 true 。
- ignoreWhitespace ,表示解析器应该忽略元素间的空格,而不是创建表现这些空格的文本节点。默认设置为 true 。
-
XML数据序列化相关的设置
- prettyIndent ,表示在序列化 XML 时,每次缩进的空格数量。默认值为 2。
- prettyPrinting,表示应该以方便人类认读的方式输出 XML,即每个元素重起一行,而且子元素都要缩进。默认设置为 true 。
命名空间
-
通过使用setNamespace()并传入Namespace对象,也可以给定元素设置命名空间
var messages =
Hello world!
其他变化
-
引入了for-each-in循环,以便迭代遍历每一个属性并返回属性的值
var employees =
Nicholas C. Zakas Jim Smith
前面启用E4X
-
要想完整地启用E4X,需要将<script>标签的type特性设置为"text/javascript;e4x=1"