XML Javascript解析问题(特定代码问题)

XML Javascript解析问题(特定代码问题),javascript,jquery,xml,xml-parsing,Javascript,Jquery,Xml,Xml Parsing,我使用以下解析器来解析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(

我使用以下解析器来解析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 data = '<xml_test>works</xml_test>';
    var xml = parseXML(data);
    $(xml).find("xml_test").each(function()
    {
        alert('this works!');
    });
var数据='works';
var xml=parseXML(数据);
$(xml).find(“xml_测试”).each(函数()
{
警惕(“这是有效的!”);
});
我知道这是一个具体的问题,但我将感谢您的帮助和/或建议

提前谢谢 Pedro

如果您使用的是jQuery(正如您的测试代码所建议的那样),只需将xml传递给它即可

var xml = $(data);
如果您使用的是jQuery(正如您的测试代码所建议的),那么只需将xml传递给它即可

var xml = $(data);

如果您使用jQuery请求资源,您应该已经获得了XMLDOM文档,以防它是以text/XMLMIME类型提供的。因此,无需解析。

如果您使用jQuery请求资源,您应该已经获得XML DOM文档,以防它使用text/XML mime类型。因此无需解析。

我使用此函数,并给出了很好的结果:

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..');
});
编辑

**编辑二**

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

我使用此功能并获得了很好的效果:

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..');
});
编辑

**编辑二**

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

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

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

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

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

我猜您会尝试传递已经解析过的XML(比如responseXML文档或其他东西)。您能否显示初始化要在此处传递的数据变量的代码?var xml=parseXML(数据)$(xml.find(“xml_测试”).each(函数(){console.info('find xml_测试…从不发生…);});可能问题与doc=parser.parseFromString(text,“text/xml”);?有关?!Sergey,$.ajax({url:'…'类型:'POST',数据类型:'xml',数据:formulario.serialize(),超时:15000,成功:函数(数据){……}没错,所以您在这里得到了您的XMLDOM文档-检查它:函数(数据){alert(data.nodeType)}我猜您试图传递已经解析过的xml(如responseXML文档或其他东西)。能否显示初始化要传递到此处的数据变量的代码?var xml=parseXML(data);$(xml)。find(“xml_-test”)。each(function(){console.info('find xml_-test…never-course..);});问题可能与doc=parser.parseFromString(text,“text/xml”)有关;?!Sergey,$.ajax({url:'…'类型:'POST',数据类型:'xml',数据:formulario.serialize(),超时:15000,成功:函数(数据){……}没错,所以您可以在这里获得XMLDOM文档-检查它:函数(数据){alert(数据.nodeType)}嗨,难以捉摸,但我们不应该避免使用jQuery解析xml?@Pedro Gil:由于jQuery经过了广泛的测试,我们可以非常确定它解析xml是正确的。它使用一些技巧通过浏览器进行解析,而不是手动解析。我认为这比尝试自己解析要好。不,jQuery不解析xml。它假装它是HTML使用
innerHTML
,这是不可靠的。请参见错误。jQuery声明。但是,它可以用于包装已解析的xml文档。您好,难以捉摸,但我们不应该避免使用jQuery解析xml?@Pedro Gil:由于jQuery经过了广泛的测试,我们可以非常确定它解析的xml是正确的。它使用一些技巧通过rowser而不是手动解析。我认为这比尝试自己解析要好。不,jQuery不解析XML。它使用
innerHTML
假装它是HTML,这是不可靠的。请看错误。jQuery声明了这一点。但是,它可以用来包装已解析的XML文档。这几乎是OP已经在做的事情。我T不起作用。是的,它肯定会起作用。我认为它对OP不起作用,因为他正在将一个已解析的DOM传递给他的
parseXML
函数(这与您的
myLoadXml
函数相同)。这几乎是OP已经在做的事情。它不起作用。是的,它肯定会起作用。我认为它对OP不起作用,因为他正在将一个已经解析的DOM传递给他的
parseXML
函数(这与您的
myLoadXml
函数相同)。