E4X是ECMAScript语言的可选扩展
19.1E4X类型
E4X定义的4个类型可以表现XML文档中的所有部分,其内部机制是将每一种类型(特别是XML和XMLList)都映射为多个DOM类型。
XML类型
创建XML对象的方式:调用构造函数(可以向构造函数传入字符串、DOM文档或节点);使用XML字面量将XML数据直接指定给一个变量。
XML类型的toXMLString()方法会返回XML对象及其子节点的XML字符串表示。如果内容简单,toString()会返回文本,否则,与toXMLString()方法返回的字符串一样。
XMLList类型
XMLList类型表现XML对象的有序集合。
创建XMLList对象的方式:使用XMLList构造函数(可以传入待解析的XML字符串);使用加号操作符来组合两个或多个XML对象;用特殊的<></>语法来完成。
XMLLIst对象的toString()和toXMLString()方法返回其包含的XML对象序列化之后再拼接起来的结果。
Namespace类型
Namespace类型是用来映射命名空间前缀和命名空间URI的,可以使用Namespace构造函数,而传入URI或前缀加URI就可以初始化Namespace对象。可以使用prefix和uri属性来取得Namespace对象中的信息。
如果XML字面量中包含命名空间,或者通过XML构造函数解析的XML字符串中包含命名空间信息,那么就会自动创建Namespace对象。
Namespace对象的toString()方法始终返回命名空间URI。
QName类型
QName类型表现的是XML对象的限定名,即命名空间与内部名称的组合。创建QName对象之后,可以访问两个属性:uri和licalName
QName对象的toString()方法会以uti::localName形式返回一个字符串。
在解析XML结构时,会为表示相应元素或特性的XML对象自动创建QName对象,可以使用这个XML对象的name()方法取得与该XML对象关联的QName对象。
在修改相应命名空间下的元素标签名或特姓名时用setName(),该名称不属于任何命名空间时用setLocalName()。
19.2一般用法
在将XML对象、元素、特性和文本集合到一个层次化对象之后,就可以使用点号加特性或标签名的方式来访问其中不同的层次和结构。
不确定子元素的内部名称,或者想访问所有子元素,可以使用星号(*)。将属性名或索引值传递给child()方法也可以访问子元素。children()方法始终返回所有子元素。ellement()方法的行为与child()类似。delete操作符可以删除子元素。
访问特性
访问特性也可以使用点语法,但必须在名称前面加上一个@字符(区分特姓名和子元素的标签名)。
要取得特性名称,可以使用对象的name()方法,也可以使用child()方法来访问特性,只要传入带有@前缀的特性的名称即可。使用attribute()方法并传入特性名(不用@)可以访问XML对象的特性。要取得XML或XMLList对象中的所有特性,可以使用attributes()方法,使用这个方法与使用@*的结果相同。
为特性指定一个新值就可以修改特性或属于的值。
为特性赋值的语法也可以用来添加新特性。
可以使用delete操作符来删除特性。
其他节点类型
设置XML构造函数的ignoreComments和ignoreProcessingInstructions为false,E4X会将注释和处理指令解析到XML结构中。
noleKind()方法可以得到XML对象表示的类型,可能的值:text、element、comment、processing-instruction、attribute。
使用hasSimpleContent()和hasComplexContent()方法可以确定XML对象中是只包含文本还是包含更复杂的内容。
查询
使用两个点可以进一步扩展查询的深度,查询到所有后代节点。要想取得特定标签的元素,需要将星号替代成实际的标签名。同样的查询可以使用descentandts()方法来完成,而传递一个名称作为参数则可以限制结果。
用@还可以缺德多有后代元素中的特性。
除了访问后代元素之外,开可以指定查询的条件,同样的语法也可以用于修改XML结构中的某一部分。
parent()方法能够在XML结构中上溯,这个方法会返回一个XML对象,表示当前XML对象的父元素。
构建和操作XML
使用XML字面量,可以在字面量中嵌入JavaScript变量,语法是使用花括号。E4X也支持使用标准的JavaScript语法来构建完整的XML结构。
XML有一些类似与DOM方法:appendChild(child)、copy()、insertChildAfter(refNode,child)、insertChildBefore(refNode,child)、prependChild(child)、replace(propertyName,value)、setChildren(children)。
序列和初始化
与XML解析相关的设置有3个:ignoreComments、ignoreProcessingInstructions、ignoreWhitespace,这3个设置会影响对传入到XML构造函数中的字符串以及XML字面量的解析。
prettyIndent和prettyPrinting这2个设置会影响toString()和toXMLString()的输出。
这5个设置都保存在setting对象中。使用defaultSettings()方法可以取得一个包含默认设置的对象。
命名空间
通过使用setNamespace()并传入Namespace对象,也可以为给定元素设置命名空间。
使用addNamespace()方法并传入Namespace对象,可以添加一个命名空间声明,而不改变元素。
调用removeNamespace()方法并传入Namespace对象,可以移除表示特定命名空间前缀和URI的命名空间声明。
namespaceDelarations()返回给定节点上声明的所有命名空间的数组,inScopeNamespaces返回给定节点作用域所有命名空间的数组。
使用双冒号(::)也可以基于Namespace对象来查询XML结构中具有特定命名空间的元素。
使用default xml namespace可以为某个作用域中的所有XML对象设置默认命名空间,并将一个Namespace对象或一个命名空间URI作为值赋给它。
19.3其他变化
引入了for-each-in循环,以便迭代遍历每一个属性并返回属性的值。
isXMLName()函数接受一个字符串,并在这个字符串是元素或特性的有效内部名称的情况返回true。
对XML对象或XMLList对象使用typeof操作符时,返回“xml”(其他对象返回“object”)。
19.4全面启用E4X
要想完整地启用E4X,需要将<script>便签的type特性设置为“text/javascript;e4x=1”