getElementById для XML-документов, расширения Mozilla - PullRequest
3 голосов
/ 08 сентября 2010

Поддерживается ли метод document.getElementById в DOM, проанализированный из строк XML с использованием метода DOMParser в Mozilla?Я делаю расширение Mozilla, которое читает файл XML и использует DOM Parser для преобразования XML в элемент DOM и пытается получить элементы по Id.Метод getElementsByTagName работает, но не getElementById.Он всегда возвращает ноль.

function (xmlString) {
    var parser = new DOMParser();
    var doc = parser.parseFromString(xmlString, "text/xml"); 
    var aNodes = doc.getElementsByTagName("nodeTag");
    for(var i=0; i<aNodes.length; ++i) {
        var id = aNodes[i].getAttribute('id');
        var resultNode = doc.getElementById(id);
        alert(id);
        alert(resultNode);
    }
}

Я пробовал приведенный выше код.alert (id) возвращает правильный идентификатор, тогда как alert (resultNode) каждый раз возвращает null.

Ответы [ 2 ]

8 голосов
/ 08 сентября 2010

Нет, document.getElementById обычно не работает с произвольными XML-документами.

В последних браузерах (например, Firefox 3.5 и более поздних) вы можете использовать document.querySelector вместо:

var resultNode = doc.querySelector("[id=" + id + "]");
2 голосов
/ 05 февраля 2013

Если вам нужно решение, которое на самом деле делает метод getElementById () пригодным для использования (что необходимо, это намного быстрее и более универсально) и у вас есть доступ к DTD, добавьте в него следующую строку:

<!ATTLIST client id ID #IMPLIED >

Если вы еще не используете DTD, просто добавьте это в документ XML сразу после оператора <?xml version= \"1.0\"?>:

<!DOCTYPE clients [ 
   <!ATTLIST client id ID #IMPLIED > 
]>

В этом примере «клиенты» - это корень моего XML-файла, а «клиент» - это элемент, к которому я хотел бы присоединить идентификаторы. Вы можете добавить несколько операторов «ATTLIST» для других элементов, которые хотите добавить идентификаторы для других типов элементов.

Я проверял это в Safari, Chrome и Firefox. работает отлично.

...