什么是Internet Explorer等效的createNSResolver?

时间:2011-12-27 19:54:42

标签: javascript internet-explorer xpath

我有一个像这样的XML文件

<a:books xmlns:a="ans">
    <a:book>
        <a:id> 1 </a:id>
        <a:title>The first book</a:title>
    </a:book>
</a:books>

默认情况下,当我对其执行XPath查询时,IE会识别xml本身的前缀

x.selectNodes('//a:book').length  //gives 1, as desired

但是,如果我告诉它使用XPath选择语言与其他浏览器一起使用,那么它就会停止识别原始XML中使用的前缀。

x.setProperty('SelectionLanguage', 'XPath') 
x.selectNodes('//a:book').length 
//throws an error: "Referência a um prefixo de espaço para nome não declarado: 'a'." 
// I would translate it as "reference to an undeclared namespace prefix".

我知道我可以使用x.setProperty('SelectionNamespaces', "xmlns:a='ans'")来阻止错误,但有没有办法以编程方式获得a->ans关系,就像我可以在其他浏览器中使用x.createNSResolver(x)一样?

1 个答案:

答案 0 :(得分:1)

您需要访问DOM中的任何名称空间声明属性,并以这种方式自己推断出prefix-&gt;名称空间URI绑定,MSXML(IE使用)没有任何方法,如createNSResolver

[编辑] 以下是一些示例代码:

function getPrefixNamespaceBindings(element) {
  var bindings = {};
  for (var i = 0,
       attributes = element.attributes,
       l = attributes.length;
       i < l;
       i++)
  {
    if (attributes[i].prefix === 'xmlns')
    {
      bindings[attributes[i].nodeName.substring(attributes[i].nodeName.indexOf(':') + 1)] = attributes[i].nodeValue;
     }
  }
  return bindings;
}

var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
doc.loadXML('<xhtml:html xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:svg="http://www.w3.org/2000/svg" id="root" xml:lang="en">...</xhtml:html>');

var bindings = getPrefixNamespaceBindings(doc.documentElement);
for (var prefix in bindings) {
  document.body.appendChild(document.createTextNode(prefix + '="' + bindings[prefix] + '" '));
}