2011-12-27 8 views
0

私が使用することを教えている場合、私はそれcreateNSResolverと同等のInternet Explorerは何ですか?

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

でXPathクエリを実行するしかし、ときに私はデフォルトではこの

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

のようなXMLファイルを持って、IEはXML自体からプレフィックスを認識し、 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

DOM内の任意の名前空間宣言属性にアクセスする必要があり、その方法で接頭辞 - >名前空間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] + '" ')); 
} 
+0

:something'接頭辞:私は 'doc.documentElement.attributes'や魚を介してすべての'のxmlnsを行くべきと言っていますか? – hugomg

+0

はい、それは私が提案したものです。投稿を編集してサンプルコードを追加します。 –

関連する問題