首页 » XML » IE中的XPath

IE中的XPath

IE对XPath的支持是内置在基于ActiveX的XML DOM文档对象中,没有使用DOMParser返回的DOM对象。因此,为了在IE及之前的版本中使用XPath,必须使用基于ActiveX的实现。这个接口的每个节点上额外的定义了两个的方法:selectSingleNode()和selectNodes()。其中,selectSingleNode()方法接受了一个XPath模式,在找到匹配节点时返回第一个匹配的节点,如果没有找到匹配的节点就返回Null。在找到匹配节点时返回第一个匹配的节点,如果没有找到匹配的节点就返回null。例如:

function createDocument() {
    if(typeof arguments.callee.activeXString != "string") {
        var versions = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument"];

        for(var i = 0, len = versions.length; i < len; i++) {
            try {
                var xmldom = new ActiveXObject(versions[i]);
                arguments.callee.activeXString = versions[i];
                return xmldom;
            } catch(ex) {
                //跳过
            }
        }
    }

    return new ActiveXObject(arguments.callee.activeXString);
}
var xmldom = createDocument();
xmldom.loadXML('<?xml version="1.0"?><employees><employee title="Software Engineer"><name>Nicholas C. Zakas</name></employee><employee title="Salesperson"><name>Jim Smith</name></employee></employees>');
var element = xmldom.documentElement.selectSingleNode("employee/name");
if(element !== null) {
    alert(element.xml);
}

这里,会返回匹配”employee/name”的第一个节点。上下文节点是xmldom.documentElement,因此就调用了该节点上的selectSingleNode()。由于调用这个方法可能会返回null值,因而有必要在使用返回的节点之前,先检查确定它不是null。

另一个方法selectNodes()也接收一个XPath模式作为参数,但它返回与模式匹配的所有节点的NodeList(如果没有匹配的节点,则返回一个包含零项的NodeList)。来看下面的例子。

var xmldom = createDocument();
xmldom.async = false;
xmldom.loadXML('<?xml version="1.0"?><employees><employee title="Software Engineer"><name>Nicholas C. Zakas</name></employee><employee title="Salesperson"><name>Jim Smith</name></employee></employees>');
var elements = xmldom.documentElement.selectNodes("employee/name");
alert(elements.length);

对这个例子而言,匹配”employee/name”的所有元素都会通过NodeList返回。由于不可能返回null值,因此可以放心地使用返回的结果。

IE对XPath的支持非常简单。除了能够取得一个节点或一个NodeList外,不可能取得其他结果类型。

IE对命名空间的支持

要在IE中处理包含命名空间的XPath表达式,你必须知道自己使用的命名空间,并按照下列格式创建一个字符串:

"xmlns:prefix='uri1' xmlns:prefix2='uri2' xmlns:prefix3='uri3'"

然后,必须将这个字符串传入到XML DOM文档对象的特殊方法setProperty()中,这个方法接收两个参数:要设置的属性名和属性值。在这里,属性名应该是”SelectionNamespaces”,属性值就是按照前面格式创建的字符串。下面来看一个在DOM XPath命名空间中对XML文档求值的例子。

xmldom.setProperty("SelectionNamespaces", "xmlns:w3cmm='https://www.w3cmm.com/'");

var result = xmldom.documentElement.selectNodes("w3cmm:book/w3cmm:author");
alert(result.length);

var xmldom = createDocument();
xmldom.loadXML("<?xml version=\"1.0\"?><w3cmm:books xmlns:w3cmm=\"https://www.w3cmm.com/\"><w3cmm:book><w3cmm:title>Professional JavaScript for Web Developers</w3cmm:title><w3cmm:author>Nicholas C. Zakas</w3cmm:author></w3cmm:book><w3cmm:book><w3cmm:title>Professional Ajax</w3cmm:title><w3cmm:author>Nicholas C. Zakas</w3cmm:author><w3cmm:author>Jeremy McPeak</w3cmm:author><w3cmm:author>Joe Fawcett</w3cmm:author></w3cmm:book></w3cmm:books>");
xmldom.setProperty("SelectionNamespaces", "xmlns:w3cmm='https://www.w3cmm.com/'");
var result = xmldom.documentElement.selectNodes("w3cmm:book/w3cmm:author");
alert(result.length);

对于这个DOM XPath的例子来说,如果不提供命名空间解析信息,就会在表达式求值时导致一个错误。

此文章发表在 XML. 将 固定链接 加入收藏.