我有一个像这样的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)
一样?
答案 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] + '" '));
}