JQuery не будет анализировать xml с узлами, называемыми опцией

Я использую jQuery для анализа некоторого XML, например:

function enumOptions(xml) {
   $(xml).find("animal").each(function(){  
       alert($(this).text());
   });
}

enumOptions("<root><animal>cow</animal><animal>squirrel</animal></root>");

Это отлично работает. Однако, если я попытаюсь найти узлы с именем "option", то это не сработает:

function enumOptions(xml) {
   $(xml).find("option").each(function(){  
      alert($(this).text());
   });
}

enumOptions("<root><option>cow</option><option>squirrel</option></root>");

Нет ошибки, только ничего не предупреждается, как будто поиск ничего не находит. Это только для узлов, называемых опцией, все, что я тестировал, работает нормально!

Я использую текущую версию jQuery - 1.4.2.

Любая идея?

ТИА.

Б.Г.

Ответ 1

Обновление

jQuery теперь имеет этот метод. Вы можете использовать

$.parseXML("..")

чтобы построить XML DOM из строки.


jQuery использует HTML DOM с помощью innerHTML для анализа документа, который может иметь ненадежные результаты, когда имена тегов совпадают с тегами в HTML.

Вместо этого вы можете использовать правильный синтаксический анализатор XML для первого анализа документа, а затем использовать jQuery для запроса. Нижеприведенный метод проанализирует действительный XML-документ в кросс-браузере:

// http://www.w3schools.com/dom/dom_parser.asp
function parseXML(text) {
    var doc;

    if(window.DOMParser) {
        var parser = new DOMParser();
        doc = parser.parseFromString(text, "text/xml");
    }
    else if(window.ActiveXObject) {
        doc = new ActiveXObject("Microsoft.XMLDOM");
        doc.async = "false";
        doc.loadXML(text);
    }
    else {
        throw new Error("Cannot parse XML");
    }

    return doc;
}

После создания XML DOM jQuery можно использовать как обычно - http://jsfiddle.net/Rz7Uv/

var text = "<root><option>cow</option><option>squirrel</option></root>";
var xml = parseXML(text);
$(xml).find("option"); // selects <option>cow</option>, <option>squirrel</option>

Ответ 2

Это, вероятно, некоторая специальная обработка для элемента HTML <option>, но я не могу найти это в источнике.

Ответ 3

В строке 4448 неустановленного источника для 1.4.2 является виновником:

// ( div = a div node )
// ( elem = the xml you've passed to it )

div.innerHTML = wrap[1] + elem + wrap[2]; 

Рассмотрим этот код:

var d = document.createElement('div');
d.innerHTML = "<foo><option>bar</option><b>blah</b></foo>";

alert(d.innerHTML); // <foo>bar<b>blah</b></foo>

// tested on Firefox 3.6

Итак, не спрашивайте меня, почему именно, но это похоже на что-то в том, как DOM обрабатывает его, не обязательно с ошибкой jQuery.

Возможно, просто используйте другое имя node?