Имитация jQuery $ .post / $ .ajax для чтения XML - PullRequest
3 голосов
/ 26 января 2011

Возможно странный вопрос; Я пытаюсь загрузить XML в jQuery, чтобы обойти его.

Используя $ .post, я могу сделать это отлично и указать XML как dataType. Мой вопрос вращается вокруг того, как я могу заставить jQuery использовать этот dataType для понимания тех же данных, если они уже есть на странице, т.е. у меня они есть в переменной.

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

Я пытался убрать объявление и убрать вопросительные знаки, экранировать кавычки и т. Д.

Я пытался загрузить как: -

var xml = new XML('<blah><moo>134</moo></blah>');

и, конечно,

var xml = $('<blah><moo>134</moo></blah>');

и

var xml = '<blah><moo>134</moo></blah>';

и

var xml = "<blah><moo>134</moo></blah>";

и т.д.. Что я делаю не так?

Ответы [ 3 ]

3 голосов
/ 01 февраля 2011

Проблема в том, что jQuery не анализирует XML, за исключением использования встроенного браузера responseXML свойство XMLHttpRequest при выполнении запросов Ajax.Если вы передаете строку XML в $(), она просто предполагает, что это HTML, назначает ее как innerHTML элемента HTML и читает дочерние элементы этого элемента HTML.Это не синтаксический анализ XML.

Для анализа XML вы можете использовать функцию, подобную следующей:

var parseXml;

if (window.DOMParser) {
    parseXml = function(xmlStr) {
        return ( new window.DOMParser() ).parseFromString(xmlStr, "text/xml");
    };
} else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) {
    parseXml = function(xmlStr) {
        var xmlDoc = new window.ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async = "false";
        xmlDoc.loadXML(xmlStr);
        return xmlDoc;
    };
} else {
    parseXml = function() { return null; }
}

var xml = parseXml("<blah><moo>134</moo></blah>");
if (xml) {
    window.alert(xml.documentElement.nodeName);
}

ОБНОВЛЕНИЕ

jQuery 1.5 'Новый метод parseXML() делает именно это и, кажется, работает хорошо.

var xml = $.parseXML("<blah><moo>134</moo></blah>");

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

var $xml = $(xml);
alert($xml.find("moo:first")[0].nodeName);
2 голосов
/ 31 января 2011

Вот пример, который использует $ .ajax и работает кросс-браузер (ну, Chrome, IE8, FireFox 3.6):

var pathToXML = "http://www.site.com/data/data.xml";
var xml;
    $.ajax({type: "GET", 
            url: pathToXML,
            cache: false, 
            dataType: ($.browser.msie) ? "text" : "xml",
            error: function(XMLHttpRequest, textStatus, errorThrown){alert(textStatus)},
            success: function(data){
            // workaround for msie
            if (typeof data == "string") {
                    xml = new ActiveXObject("Microsoft.XMLDOM");
                    xml.async = false; xml.loadXML(data);
            } else { xml = data; }
            xml.setProperty("SelectionLanguage", "XPath");
            // end workaround
            // use $(xml).find('node').text();
            var bobsNodeValue = $(xml).find("node[id='bob']").text();
    }});

Это также устанавливает его как фактический XML, который jQuery может проходить, как обычное дерево DOM, используя .find() и .text().

РЕДАКТИРОВАТЬ :: Просто прочитайте новые комментарии к вопросу. Можете ли вы опубликовать пример неудачного XML здесь? Кроме того, использование .html(), вероятно, приведет к ошибкам, тогда как .text() должно возвращать пустую строку для пустых узлов.

РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ :: Вот скрипка , показывающая без ошибок, какой код вы используете для обхода и все ли это браузеры или только определенный?

0 голосов
/ 01 февраля 2011

Вы пытались urlencode xml перед отправкой в ​​jQuery?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...