创建和解析XML文档
DOM2级创建XML文档
var xmldom = document.implementation.createDocument(namespaceuri,root,doctype);
// 其中namespace为命名空间,很少用到。
// root为根元素的标签名
// doctype为文档内型,也很少用到
示例
var xmldom = document.implementation.createDocument("",root,null);
alert(xmldom.document.tagName); //"root"
var child = document.createElement("child");
xml.documentElement.appendChild(child);
DOMParser解析XML文档
首先需要创建一个DOMParser类型的实例,然后再调用parseFromString()
方法,该方法接受两个参数,要解析的XML字符串和内容类型(”text/xml”),返回一个document实例
var parser = new DOMParser();
var xmldom = parser.parseFromString("<root><child></child></root>","text/xml");
alert(xmldom.documentElement.tagName); //"root"
alert(xmldom.documentElement.firstChild.tagName); //"child"
- DOMParser只能解析格式良好的XML,因此不能解析HTML,否则会发生解析错误
XMLSerializer类型
与DOMParser相反,该类型的serializeToString()
方法将DOM文档序列化为字符串
var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmldom);
alert(xml);
- 不仅包括个别节点,也包括HTML文档,也能解析为字符串
IE创建和解析XML字符串
在IE中创建一个XML文档的实例,需要先创建ActiveX对象的实例,并传入一个表示XML文档版本的字符串
var xmldom = new ActiveXObject("MSXML2.DOMDocument.6.0");
解析XML字符串,需要先用上述方法创建一个DOM文档,然后调用loadXML()
方法,传入的XML字符串会解析到DOM文档中
xmldom.loadXML("<root><child></child></root>");
alert(xmldom.documentElement.tagName); //"root"
alert(xmldom.documentElement.firstChild.tagName); //"child"
在IE中序列化XML非常简单,XML字符串被保存在每个结点的xml属性中
alert(xmldom.xml);
可以通过load()
方法加载来自服务器的文件,接受一个参数,即url。可以设置async
属性,true表示异步,false表示同步
var xmldom = new ActiveXObject("MSXML2.DOMDocument.6.0");
xmldom.async = false;
xmldom.load("example.xml");
- 虽然此种方法可以加载,公认还是使用XMLHttp-Request对象加载XML文件比较好
XPath
XPath用来在DOM文档查找节点,其使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
非IE浏览器
使用evaluate()
方法选择节点,接受5个参数,XPath表达式,上下文节点,命名空间求解器(存在命名空间时使用,否则为null),返回结果的类型和保存结果的XPathResult对象(通常为null)。
常用的返回结果类型:
XPathResult.ANY_TYPE(返回与XPath表达式匹配的数据类型)
XPathResult.ORDERED_NODE_ITERATOR_TYPE(返回匹配的节点集合,需用iterateNext()
方法从节点集合中取得匹配的节点)
XPathResult.FIRST_ORDERED_NODE_TYPE(返回第一个匹配的节点)
var results = xmldom.evalute("employee/name",xmldom.documentElement,null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE,null);
if (result !== null){
var element = result.iterateNext();
while(element){
alert(element.tagName);
node = result.iterateNext();
}
}
当XML文档使用的命名空间时,需要通过createNSResolver()
来创建XPathNSResolver对象,该方法接受一个参数,即文档中包含命名空间定义的节点。
var nsresolver = xmldom.createNSResolver(xmldom.documentElement);
var result = xmldom.evalute("wrox:book/wrox:author",xmldom.documentElement,
,nsresolver,nsresolver,XPathResult.ANY_TYPE,null);
IE浏览器
返回第一个匹配的节点,使用selectSingleNode()
方法,接受一个参数,即XPath模式
var element = xmldom.documentElement.selectSingleNode("employee/name");
返回匹配的节点集合,使用selectNodes()
方法,接受一个参数,即XPath模式
var elements = xmldom.documentElement.selectNodes("employee/name");
对于有命名空间的XML文档,必须知道按下列格式创建一个字符串,并将该字符串传入setProperty()
中,设置属性名为”SelectionNamespaces”
"xmlns:prefix1='uri1' xmlns:prefix2='uri2' xmlns:prefix3='uri3'"
xmldom.setProperty("SelectionNamespaces","xmlns:wrox='http://www.wrox.com'");
var result = xmldom.documentElement.selectNodes("wrox:book/wrox:author");
alert(result.length);