【问题标题】:XML Javascript parse problem (specific code question )XML Javascript 解析问题(具体代码问题)
【发布时间】:2011-04-19 08:38:34
【问题描述】:

我正在使用下面的解析器来解析 xml

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;
}

我不明白为什么它不能处理我通过 AJAX 获得的 XML 文档。

通过 AJAX 请求的结果:

X-Powered-By    PHP/5.2.11
Content-Length  887
Keep-Alive  timeout=5, max=95
Connection  Keep-Alive
Content-Type    text/xml

<?xml version="1.0" encoding="UTF-8"?>
<xml_test>wont work!</xml_test>

测试代码:

    var xml = parseXML(data);
    $(xml).find("xml_test").each(function()
    {
        console.info('found xml_test... never happen..');
    });

但如果我这样使用它,它会很好地工作!

    var data = '<xml_test>works</xml_test>';
    var xml = parseXML(data);
    $(xml).find("xml_test").each(function()
    {
        alert('this works!');
    });

我知道这是一个具体的问题,但我会感谢您的帮助和/或建议...

提前致谢 佩德罗

【问题讨论】:

  • 我的猜测是您尝试传递已解析的 XML(如 responseXML 文档或其他内容)。你能显示初始化要在此处传递的数据变量的代码吗? var xml = parseXML(数据); $(xml).find("xml_test").each(function() { console.info('found xml_test...永远不会发生..'); });
  • 可能问题与 doc = parser.parseFromString(text, "text/xml"); ?!
  • Sergey, $.ajax({ url: '...' type: 'POST', dataType: 'xml', data: formulario.serialize(), timeout: 15000, success: function(数据){.........}
  • 没错,所以你在这里得到你的 XMLDOM 文档 - 检查它:function(data) {alert(data.nodeType)}

标签: javascript jquery xml xml-parsing


【解决方案1】:

如果您使用 jQuery 来请求您的资源,您应该已经获得 XML DOM 文档,以防它以 text/xml mime-type 提供。因此无需解析。

【讨论】:

    【解决方案2】:

    如果您通过 Ajax 获取 XML,则无需解析它,因为浏览器会为您解析。只需使用 XMLHttpRequest 对象的responseXML 属性,它将为您提供一个 XML 文档对象。 jQuery 使用“xml”为dataType 包装它:

     $.ajax({
         type: "GET",
         url: "foo.xml",
         dataType: "xml",
         success: function(xml) {
             alert(xml.documentElement.nodeName);
         }
     });
    

    【讨论】:

      【解决方案3】:

      我使用了这个功能,结果很好:

      var myLoadXml = function(s){
      
        var objxml = null;
      
        if(document.implementation && document.implementation.createDocument) {
      
           var objDOMParser = new DOMParser();
           objxml = objDOMParser.parseFromString(s, "text/xml");
      
        } else if (window.ActiveXObject) {
      
           objxml = new ActiveXObject('MSXML2.DOMDocument.3.0');
           objxml.async = false;
           objxml.loadXML(s);
      
        }
      
        return objxml;
      };
      
      
      var xml = myLoadXml(data);
      
      $(xml).find("xml_test").each(function()
      {
          console.info('found xml_test... never happen..');
      });
      

      编辑 Example

      ** 编辑二 **

      function parseXML(text) {
          var doc;
      
          if (typeof text == 'object'){ // check type of text
              return text; 
          }
      
          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;
      }
      

      【讨论】:

      • 这几乎是 OP 已经在做的事情。而且它不工作。
      • 是的,它肯定可以工作。我认为这对 OP 不起作用,因为他正在将已解析的 DOM 传递给他的 parseXML 函数(与您的 myLoadXml 函数相同)。
      【解决方案4】:

      如果您使用的是 jQuery(正如您的测试代码所建议的那样),您可以简单地将 xml 传递给它。

      var xml = $(data);
      

      【讨论】:

      • 嗨,难以捉摸,但我们不应该避免使用 jQuery 解析 xml?
      • @Pedro Gil:由于 jQuery 已经过广泛测试,我们可以确定它正确解析了 XML。它使用一些技巧通过浏览器进行解析,而不是手动解析。我认为这比尝试自己解析要好。
      • 不,jQuery 不解析 XML。它使用innerHTML 假装它是HTML,这是不可靠的。见stackoverflow.com/questions/2908899/…
      • 错误。 jQuery 声明 $ is not to be used to parse an xml string。然而,它可以用来包装已经解析的 xml 文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多