JavaScript
十九、E4X
- ECMAScript的可选拓展
- ECMAScript for XML
19.1 E4X的类型
- E4X定义的全局类型
- XML
- XMLList
- Namespace 命名空间前缀与命名空间URI之间的映射
- QName 由内部名称和命名空间URI组成的一个限定名
19.1.1 XML类型
- 创建XML对象
- 调用构造函数
- 传入字符串
- 传入DOM
- XML字面量
- 调用构造函数
var x=new XML("<employee position=\"Software Engineer\"><name>Nicholas Zakas"
+"</name></employee>");
var x = new XML(xmldom);
var employee = <employee position="Software Engineer">
<name>Nicholas Zakas</name>
</employee>;
- 序列化
- toXMLString()
- 返回对象及所有子节点的XML字符串表示
- toString()
- 当为文本节点时返回文本,否则和toXMLString()返回内容相同
- toXMLString()
19.1.2 XMLList类型
- 与XML类型区别较小,二者都有length()方法和由[0]引用的属性
- 创建XMLList对象
- 调用构造函数
- 传入字符串
- 操作符连接多个XML对象
- +
- <> … </>
- XML字面量
- 调用构造函数
var list=new XMLList("<item/><item/>");
var list=<item/> + <item/>;
var list = <><item/><item/></>
//employees为xml对象,employees.employee为xmllist对象
var employees = <employees>
<employee position="Software Engineer">
<name>Nicholas Zakas</name>
</employee>
<employee position="Salesperson">
<name>Jim Smith</name>
</employee>
</employees>;
- 序列化结果相同
- toXMLString()
- toString()
19.1.3 Namespace类型
- 创建Namespace对象
- 构造函数
- 传入命名空间或(前缀+命名空间)
- 构造函数
- 访问前缀、命名空间
- prefix
- uri
- 创建xml对象时,如果其中包含命名空间,则会自动创建Namespace对象
- 通过前缀名获取xml对象中的Namespace对象
- namespace(prefix)
- toString()
- 返回命名空间URI
var wrox = new Namespace("wrox","http://www.wrox.com");
alert(wrox.prefix);
alert(wrox.uri);
var xml = <wrox:root xmlns:wrox="http://www.wrox.com/">
<wrox:message>Hello World!</wrox:message>
</wrox:root>;
var wrox = xml.namespace("wrox");
19.1.4 QName类型
- 创建QName对象
- 构造函数
- 传入名称或(Namespace对象+名称)
- 构造函数
- 访问命名空间、名称
- uri
- localName
- 创建xml对象时,如果其中包含命名空间,则会自动创建QName对象
- 获取xml对象中的Namespace对象
- name()
- 设置XML对象限定名
- setName(QName)
- setLocalName(nameStr) 无命名空间信息
- toString()
- 返回uri::localName
var wrox = new Namespace("wrox","http://www.wrox.com");
var wroxMessage = new QName(wrox, "message");
alert(wroxMessage.uri);
alert(wroxMessage.localName);
var xml = <wrox:root xmlns:wrox="http://www.wrox.com/">
<wrox:message>Hello World!</wrox:message>
</wrox:root>;
var wroxRoot = xml.name();
19.2 一般用法
- 访问子元素
- 通过属性的方式访问
- 每个子元素都是父元素的一个属性,属性名与元素内部名称相同
- 多个元素具有相同的标签名,返回XMLList
- 不确定内部名称或想访问所有子元素,可以使用星号(*)
- 通过实例方法访问
- child()接收属性名、索引值以及星号
- children()始终返回所有子元素
- element()与child()类似,但只返回XML对象
- 通过属性的方式访问
- 删除子元素
- delete + 子元素XML对象
19.2.1 访问特性
- 访问子元素特性
- 通过属性的方式访问
- 每个特性元素都是元素的一个属性,属性名与特性名称相同
- 为了与子元素的标签名区分,需要在访问特性前加@
- 通过实例方法访问
- child() 接收@ + 特性名称
- attribute() 接收特性名称,不需要加@
- 如果在XML对象上调用,则返回XML类型的特性
- 如果在XMLList对象上调用,则返回XMLList类型的特性
- attributes() 返回所有特性
- 通过属性的方式访问
var employees = <employees>
<employee position="Software Engineer">
<name>Nicholas Zakas</name>
</employee>
<employee position="Salesperson">
<name>Jim Smith</name>
</employee>
</employees>;
var attrs1 = employees.employee[0].@position;
19.2.2 其他节点类型
- 默认情况下,E4X不会解析注释或处理指令,这些部分不会出现在最终的对象层次中
- 设置XML构造函数的属性,使解析器解析注释和处理指令
- XML.ignoreComments = false
- XML.ignoreProcessingInstructions = false
- XML类型可以表示所有节点
- nodeKind() 确定节点类型
- “text”
- “element”
- “comment”
- “processinginstruction”
- “attribute”
- nodeKind() 确定节点类型
- attributes()
- 返回XML对象的所有特性
- comments()
- 返回所有子注释节点
- elements(tagName)
- 返回所有子元素,可以提供标签名进行过滤
- processingInstructions(name)
- 返回所有处理指令,可以通过名称过滤
- text()
- 返回所有文本子节点
- hasSimpleContent()
- XML对象只包含文本节点则返回true
- hasComplexContent()
- XML对象包含任何非文本节点则返回true
19.2.3 查询
- 访问后代元素或特性
- 通过属性的方式访问
- employee. .name
- employee. .@position
- 通过实例方法访问
- descendants() 接收属性名、@+特性名
- 通过属性的方式访问
- 指定查询条件
- employees.employee.(@position == “Salesperson”)
- 返回XMLList类型
- 所有position特性值为“Salesperson”的<employee/>元素
- employees.employee.(@position == “Salesperson”)
- parent()
- 返回XML对象的父元素
- XMLList上调用,则返回XMLList列表中所有对象的公共父元素
- 例如
- var employees2 = employees.employee.parent()
- 其中 employee2 等于 employees
19.2.4 构建和操作XML
- 在XML字面量中插入javascript变量
var tagName = "color";
var color = "red";
var xml= <{tagName}>{color}</{tagName}>;
- 使用javascript语法构建XML结构
var employees = <employees/>;
employees.employee.name = "Nicholas C. Zakas";
employees.employee.@position = "Software Engineer";
employees.employee + = <employee position="Salesperson">
<name>Jim Smith</name>
</employee>
- DOM方法
- appendChild(child)
- copy()
- insertChildAfter(refNode, child)
- insertChildBefore(refNode, child)
- prependChild(child)
- replace(propertyName, value)
- setChildren(children)
19.2.5 解析和序列化
- E4X将解析和序列化数据的控制放在了XML构造函数的属性中
- 解析相关,默认都为true
- ignoreComments
- ignoreProcessingInstructions
- ignoreWhitespace 元素间空格
- 影响对传入XML构造函数中的字符串以及XML字面量的解析
- 序列化相关
- prettyIndent 每次缩进的空格数量,默认为2
- prettyPrinting
- 是否应该以方便人类认读的方式输出XML,即每个元素重起一行,子元素缩进
- 默认为true
- 影响 toString() 和 toXMLString() 的输出
- 解析相关,默认都为true
- 访问以上设置
- XML.settings()
- 设置
- XML.setSettings(settings)
19.2.6 命名空间
- setNamespace()
var message = <messages>
<message>Hello world!</message>
</messages>
messages.setNamespace(new Namespace("wrox","http://www.wrox.com/"));
<wrox:messages xmlns:wrox="http://www.wrox.com/">
<message>Hello world!</message>
</wrox:messages>
- addNamespace() 只添加命名空间,不改变元素
<messages xmlns:wrox="http://www.wrox.com/">
<message>Hello world!</message>
</messages>
- removeNamespace(namespace)
- 移除前缀和命名空间声明
- namespaceDeclarations()
- 给定节点上声明的所有命名空间数组
- inScopeNamespace()
- 给定节点作用域中(即自身和祖先元素中声明的)所有命名空间的数组
- 查询给定namespace的元素
- ::
var message = <messages>
<message>Hello world!</message>
</messages>
var wroxNs = new Namespace("wrox","http://www.wrox.com/");
var wroxMessages = message.wroxNs::message;
- 设置某个作用域中所有XML对象的默认命名空间
//全局默认命名空间
default xml namespace = "http://www.wrox.com/";
function doSomething(){
//函数作用域中的默认命名空间
default xml namespace = new Namespace("your", "http://www.yourdomain.com");
}
19.3 其他变化
- for-each-in
- 非XML对象也可以使用
for each(var child in employees){
//每个子节点,包括注释、处理指令和文本节点,不包括特性
alert(child.toXMLString());
}
- isXMLName()
- 判断名称是否是有效的,符合命名规范
- typeof
- XML或XMLList对象返回"xml"
- instance of 无法区分XML和XMLList
19.4 全面启用E4X
- 浏览器默认只启用E4X中与javascript相安无事的特性
- 完整启用E4X
- <script type=“text/javascript;e4x=1” src=“e4x_file.js”></script>