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

本文详细探讨了JavaScript与XML的交互,包括DOM操作、XPath查询和XSLT转换,覆盖了跨浏览器兼容性和IE特有功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

十八、JavaScript与XML

18.1 浏览器对XML DOM的支持

18.1.1 DOM2级核心

  • 只提供了创建XML文档的API
    • document.implentation.createDocument(namespace, root, doctype)
  • 通常只需要将XML解析为DOM,不需要从头创建文档

18.1.2 DOMParser类型

  • DOMParser
    • 实例方法
      • parseFromString(str, type):将XML字符串解析为DOM元素
var parser = new DOMParser();
var xmldom = parser.parseFromString("<root><child></child></root>,"text/xml");

alert(xmldom.documentElement.tagName);
alert(xmldom.documentElement.firstChild.tagName);

var anotherChild = xmldom.createElement("child");
xmldom.documentElement.appendChild(anotherChild);

18.1.3 XMLSerializer类型

  • XMLSerializer
    • serializeToString(dom):将DOM元素序列化为XML或HTML字符串

18.1.4 IE8及之前版本中的XML

  • 通过ActiveXObject函数构建

18.1.5 跨浏览器处理XML

  • 能力检测确定是否为IE,再做出相应的操作

18.2 浏览器对XPath的支持

  • XPath
    在DOM文档中查找节点
    • 使用路径表达式来选取 XML 文档中的节点或节点集
表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
.选取当前节点
选取当前节点的父节点
@选取属性
  • 示例
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>

<book>
  <title lang="eng">Harry Potter</title>
  <price>29.99</price>
</book>

<book>
  <title lang="eng">Learning XML</title>
  <price>39.95</price>
</book>

</bookstore>
路径表达式结果
bookstore选取 bookstore 元素的所有子节点
/bookstore选取根元素 bookstore
bookstore/book选取属于 bookstore 的子元素的所有 book 元素
//book选取所有 book 子元素,而不管它们在文档中的位置
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置
//@lang选取名为 lang 的所有属性

18.2.1 DOM3级XPath

  • createExpression(expression, nsresolver) 将XPath表达式及相应的命名空间信息转换为一个XPathExpression,相当于查询的编辑版
  • createNSResolver(node) 根据node的命名空间信息创建一个新的XPathNSResolver对象
  • evaluate(expression, context, nsresolver, type, result) 在给定的上下文中,基于特定命名空间信息来对XPath表达式求值
    • type
      • 返回的结果类型
      • 取值范围
        • XPathResult.ANY_TYPE
        • XPathResult.NUMBER_TYPE
18.2.1.1 单节点结果
var result = xmldom.evalute('employee/name', 
	xmldom.documentElement, null
	,XPathResult.FIRST_ORDERED_NODE_TYPE,null);
if(result!=null)
{
	alert(result.singleNodeValue.tagName);
}
18.2.1.2 简单类型结果
  • 通过booleanValue、numberValue、stringValue属性返回表达式计算结果
var result = xmldom.evalute('count(employee/name)', 
	xmldom.documentElement, null
	,XPathResult.NUMBER_TYPE,null);
if(result!=null)
{
	alert(result.numberValue);
}
18.2.1.3 默认类型结果
  • resultType属性表示返回的结果类型
var result = xmldom.evalute('count(employee/name)', 
	xmldom.documentElement, null
	,XPathResult.ANY_TYPE,null);
if(result!=null)
{
	switch(result.resultType){
		case XPathResult.STRING_TYPE:
			...
			break;
		case XPathResult.NUMBER_TYPE:
			...
			break;
	}
}
18.2.1.4 命名空间支持
<?xml version="1.0" ?>
<wrox:books xmlns:wrox="http://www.wrox.com/">
	<wrox:book>
		<wrox:title>Professional JavaScript for Web Developers</wrox:title>
		<wrox:author>Nicholas C. Zakas</wrox:author>
	</wrox:book>	
</wrox:books>
  • 方式一:使用createNSResolver()方法
//包含命名空间定义的节点
var nsresolver = xmldom.createNSResolver(xmldom.documentElement);
var result = xmldom.evalute('wrox:book/wrox:author', 
	xmldom.documentElement, nsresolver
	,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
if(result!=null)
{
	alert(result.snapshotLength);
}
  • 方式二:定义一个函数
    • 接收一个命名空间前缀,返回关联的URI
    • 在不确定文档中的哪个节点包含命名空间定义的情况下使用
//包含命名空间定义的节点
var nsresolver = function(prefix){
	switch(prefix){
		case "wrox": return "http://www.wrox.com/";
		break;
		...
	}
};
var result = xmldom.evalute('wrox:book/wrox:author', 
	xmldom.documentElement, nsresolver
	,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
if(result!=null)
{
	alert(result.snapshotLength);
}

18.2.2 IE中的XPath

  • 节点方法
    • selectSingleNode()
    • selectNodes()
  • DOM文档对象方法
    • setProperty()
      • 实现对命名空间的支持
      • 接收参数
        • 属性名 SelectionNamespaces
        • 属性值
          • "xmlns:prefix1=‘url1’ xmls:prefix2=‘url2’ "

18.2.3 跨浏览器使用XPath

  • 重新实现selectSingleNode()和selectNodes()方法

18.3 浏览器对XSLT的支持

  • XSLT
    • 使用 XSLT 将 XML 文档转换为其他文档

18.3.1 IE中的XSLT

18.3.1.1 简单的XSLT转换
  • transformNode()
    • 载入XSLT后,在节点上调用,返回包含转换信息的字符串
xmldom.load("employee.xml");
xsltdom.load("employees.xslt");
var result = xmldom.transformNode(xsltdom);
18.3.1.2 复杂的XSLT转换
  1. 创建线程安全的XML DOM文档
    MSXML2.FreeThreadedDOMDocument.6.0
  2. 创建模板
    MSXML2.XSLTemplate.6.0
  3. 利用模板创建XSL处理器对象
    MSXML2.XSLTemplate.6.0
  4. 利用处理器对象进行更多的转换控制
    • input属性设置为要进行转换的节点
    • 可以在样式表中定义参数,通过处理器对象的 addParameter()方法设置参数
var xsltdom=createThreadSafeDocument();
xlstdom.async=false;
xsltdom.load("employee.xslt");
var template = createXSLTemplate();
template.stylesheet=xsltdom;

var processor = template.createProcessor();
processor.input = xmldom;
processor.transform();

var result = processor.output;

18.3.2 XSLTProcessor类型

  • 除IE外的浏览器对XSLT的支持
  • 转换过程
    1. 加载DOM文档,基于XML和基于XSLT
    2. 创建XSLTProcessor对象
    3. 为XSLTProcessor对象指定XSLT DOM
      • importStylesheet()
    4. 执行转换
      • 转换整个DOM
        • transformToDocument()
      • 转换文档片段
        • transformToFragment()
          • 接收参数
            • 需要进行转换的XML DOM片段
            • 设置想要将返回的片段插入到某个文档
              • 只设定归属,不实际插入
var processor = new XSLTProcessor();
processor.importStylesheet(xlstdom);
var result = processor.transformToDocument(xmldom);
18.3.2.1 使用参数
  • setParameter(NS_URL, ParameterName, ParamterValue)
  • getParameter(NS_URL, ParameterName)
  • removeParameter(NS_URL, ParameterName)
18.3.2.2 重置处理器
  • 重复使用XSLTProcessor实例,清除所有参数和样式表
  • reset()

18.3.3 跨浏览器使用XSLT

  • 将XSLT转换的DOM序列化为字符串的形式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值