JavaScript高级程序设计-第三版(E4X)

十九、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()返回内容相同

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”
  • 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/>元素
  • 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() 的输出
  • 访问以上设置
    • 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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值