【问题标题】:Simulating jQuery $.post / $.ajax for XML reading模拟 jQuery $.post / $.ajax 进行 XML 读取
【发布时间】:2011-06-16 01:34:54
【问题描述】:

可能是奇怪的问题;我正在尝试将 XML 加载到 jQuery 中以对其进行遍历。

使用 $.post 我可以完美地做到这一点,并将 XML 指定为数据类型。我的问题围绕着如何让 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 我以前从未听说过这样做,但我知道这将是一个有用的功能。
  • 你能展示你用来遍历 XML 字符串的代码吗?
  • 我们发现了更多关于这个问题的信息。是的,Rocket ......代码确实在那里工作,但是将我们的(大)xml 放入并遍历 EMPTY 节点失败了。 IE。我从一个没有价值的节点获得了一个价值。这似乎指出了问题所在; jQuery post/ajax 对 XML 做了一些事情,以清除它知道 jQuery 绊倒的东西。我们一直在清除和清除,但仍然遇到由 XML 数据创建的对象的问题。如果有人知道 jQuery 对 dataType 中的 xml 处理的 post/ajax 的操作/示意图,那真的很有帮助。
  • 可能相关(已在 jQuery 1.5 中修复):bugs.jquery.com/ticket/6693

标签: javascript jquery xml parsing


【解决方案1】:

这是一个使用 $.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 树一样遍历它。

编辑:: 只需阅读新的 cmets 即可。你能在这里发布一个失败的xml的例子吗?此外,使用.html() 可能会导致错误,而.text() 应该为空节点返回一个空白字符串。

EDIT EDIT:: 这是一个fiddle 显示没有错误,您使用什么代码来遍历它是所有浏览器还是只是一个特定的?

【讨论】:

  • 好的,所以我们有:- - 当它到达 失败了。正如我所说,这不会因 $.post 而失败。
  • 添加了一个小提琴,显示它返回空,你使用什么代码来遍历该字符串,因为我认为我的注意力方向错误。
【解决方案2】:

您尝试在将 xml 发送到 jQuery 之前对其进行 urlencode?​​p>

【讨论】:

    【解决方案3】:

    问题是jQuery不解析XML,除了在做Ajax请求时使用XMLHttpRequest的内置浏览器responseXML属性。如果您将 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多