2011-12-27 3 views
0

У меня есть XML-файл, как этотЧто представляет собой Internet Explorer эквивалент createNSResolver?

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

По умолчанию IE распознает префиксы от самого XML, когда я делаю запрос XPath на нем

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

Вам нужно будет получить доступ к любым объявлениям декларации пространства имен в 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

Просто, чтобы подтвердить: вы говорите, я должен пройти через 'doc.documentElement.attributes' и рыбы всех' Xmlns: something' префиксов? – hugomg

+0

Да, вот что я предложил. Я отредактирую сообщение и добавлю пример кода. –

Смежные вопросы