如何从jQuery返回的XMLDocument中获取整个XML字符串(跨浏览器)?

40
我试过了,但无法找到如何从GET返回的XMLDocument中获取整个XML字符串的方法。虽然在SO上有很多关于如何查找或替换对象中特定元素的问题,但我似乎找不到任何关于如何获取整个文档作为字符串的答案。
我正在使用来自这里的示例进行工作。我感觉这应该是非常简单的,但我找不到方法。是否有一个类似于“xml.data()”的函数可以用于此目的?
$.ajax({
    url: 'document.xml',
    type: 'GET',
    dataType: 'xml',
    timeout: 1000,
    error: function(){
        alert('Error loading XML document');
    },
    success: function(xml){
        // do something with xml
    }
});

我的使用场景是将XML提供给Flash插件,为此我需要将实际的XML作为字符串传递。

6个回答

54

如果您想同时获取XML文档和字符串响应,请将响应作为XML文档和字符串获取。您应该能够执行以下操作:

success: function(data){
  //data.xml check for IE
  var xmlstr = data.xml ? data.xml : (new XMLSerializer()).serializeToString(data);
  alert(xmlstr);
}
如果您想要一个字符串,为什么要指定dataType:xml?是否更应该使用dataType:text

如果我设计了一个XML对象,为什么我不会有一个API来获取数据呢? - icecream
XML对象用于获取/操作存储在XML中的数据。您需要XML本身,这是一个略微不同的东西 :) - Olly Hodgson
为什么和BalusC给出的答案完全一样,却没有一个赞同或被采纳呢? - jitter
@Olly:如果我两个都想要怎么办?那我是不是应该将其作为字符串获取,然后在客户端上创建一个XMLDocument?现在将“xml”更改为“text”已经解决了我的问题,但我仍然认为XMLDocument应该有一个“getData()”函数或类似的函数。 @jitter:我觉得BalusC在你之前回答了,但我会给你点赞。 - icecream
如果您需要同时返回XmlDocument和字符串,请提供答案。 - jitter
对我来说似乎不起作用:TypeError: XMLSerializer.serializeToString的第一个参数未实现Node接口。 - Yster

44

我需要作为字符串的实际XML内容

您想要将其作为纯文本而不是XML对象吗? 将dataType'xml'更改为'text'。 有关更多选项,请参阅$.ajax文档


谢谢。我知道这很简单 :) - icecream
+1 它能够正常工作,尽管在我找到的文档中没有记录。感谢 ajax#options 链接。 - Krzysztof Jabłoński

23

您还可以轻松地将XML对象转换为字符串,在您的JavaScript中:

var xmlString = (new XMLSerializer()).serializeToString(xml);

jitter的回答更好,因为它也支持IE。 - ZiggyTheHamster
5
对我似乎不起作用:TypeError: XMLSerializer.serializeToString的第一个参数未实现Node接口。 - Yster

1
如果您只需要一个表示从jquery返回的xml的字符串,只需将数据类型设置为"text",而不是尝试将xml解析回文本。以下内容应该只会从ajax调用中返回原始文本:
$.ajax({
    url: 'document.xml',
    type: 'GET',
    dataType: 'text',
    timeout: 1000,
    error: function(){
        alert('Error loading XML document');
    },
    success: function(xml){
        // do something with xml
    }
});

1

虽然这个问题已经有了答案,但我想指出一个警告:当使用Internet Explorer和jQuery检索XML时,您必须指定内容类型为"text/xml"(或"application/xml"),否则您将无法像使用jQuery解析XML数据一样解析它。

您可能会认为这是一个显而易见的事情,但当我使用Mozilla/Chrome/Opera而不是IE时,它却让我困扰。当使用内容类型为"text"的XML字符串进行检索时,除IE外的所有浏览器仍将允许您使用jQuery选择器解析该数据,就好像它是XML一样。IE不会抛出错误,只是不会向jQuery选择语句返回任何结果。

因此,在您的示例中,只要您只需要XML的字符串序列化版本,并且不希望jQuery对XML DOM执行任何选择操作,您可以将内容类型设置为"text"。但是,如果您还需要使用jQuery解析XML,则需要编写自定义程序将XML序列化为字符串,或者检索具有内容类型"xml"的XML版本。

希望这能帮助到某些人 :)


1
你可以获取在请求中使用的本地XMLHttpRequest对象。 在我发布这个答案的时候,jQuery文档列出了几种方法来实现这一点。 其中之一是通过成功回调函数的第三个参数:
success: function(xml, status, xhr){
    console.log(arguments);
    console.log(xhr.responseXML, xhr.responseText);
    console.log('Finished!');
}

完整的示例请参见: https://jsfiddle.net/44m09r2z/


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