模拟jQuery $.post / $.ajax 以读取XML

3
可能有些奇怪的问题:我正在尝试将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>";

等等,我做错了什么?


+1 我之前从未听说过这种做法,但我可以看出它会是一个有用的功能。 - Jake
你能展示一下你用来遍历XML字符串的代码吗? - Jake
试试这个:https://dev59.com/iXM_5IYBdhLWcg3wp00X - chprpipr
1
我们已经找到了有关问题的更多信息。是的,Rocket …… 代码在那里确实可以运行,但将我们(大量的)xml放入其中并遍历EMPTY节点失败了。即我从一个没有值的节点中获取了一个值。这似乎指向了问题; 即jQuery post / ajax对XML进行了某些操作以清除它知道jQuery会遇到问题的内容。我们一直在不断地筛选和清理,但仍然遇到XML数据创建的对象的问题。如果有人知道jQuery在dataType处理后/ ajax中对xml执行的操作的简要说明/概述,那真的会很有帮助。 - waxical
3
或许相关(已经在jQuery 1.5中修复):http://bugs.jquery.com/ticket/6693 - Heikki
显示剩余4条评论
3个回答

3
问题在于jQuery不会解析XML,除非使用内置浏览器XMLHttpRequestresponseXML属性进行Ajax请求。如果您将XML字符串传递给$(),它会简单地假定它是HTML,将其分配为HTML元素的innerHTML并读取该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
这是一个使用$.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可以使用.find().text()像普通DOM树一样遍历它。
编辑::刚刚阅读了问题的新评论。您能在这里发布一个失败的xml示例吗?此外,使用.html()可能会导致错误,而.text()应该返回空字符串以表示空节点。
编辑编辑::这是一个演示,没有错误,您正在使用哪个代码进行遍历,所有浏览器都有问题还是只有特定的浏览器?

好的,我们有:- <thexml><foo node="foo"></foo><bar></bar></thexml> - 当它到达<bar></bar>时它失败了。就像我所说的,这在使用$.post时不会失败。 - waxical
添加了一个示例代码,证明它返回为空。你使用什么代码来遍历那个字符串?我觉得我可能在错误的方向上进行着思考。 - WSkid

0
你尝试在将XML发送给jQuery之前对其进行urlencode吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接