使用jQuery将XML转换为字符串

27

我正在使用jQuery ajax加载器加载一个xml文件,并需要将其转换为字符串,以便我可以使用PHP post变量再次保存它。最好的方法是什么?

<script type='text/javascript'>

jQuery.ajax({
    type: "GET",
    url: "data.xml",
    dataType: "xml",
    success: parseXML
    });


function parseXML(xml) {

    var xml_string = jQuery(xml).text();  // (This doesn't work- returns tagless, unformatted text) 
    alert(xml_string);

}

</script>

jQuery(xml).html()怎么样?还是只用xml - Blindy
2
@Blindy- 你不能在 XML 上使用 .html(),只有 xml 返回 = [object Document]。 - Yarin
3
如果您不需要解析XML,只需获取文本,请将dataType更改为"text"。 - Ahmed Nuaman
没错,然后仍然将其加载为“文本”,那么您就获得了一个字符串。然后您可以通过执行 $(xmlString)来解析XML,轻而易举! - Ahmed Nuaman
请注意,如果您只想显示XML,则 console.log(xml); 更适合。在Firebug和类似工具中,您可以浏览XML文档树,而不必解密复杂的字符串(假设它可能变得有点长)。 - Alexis Wilke
显示剩余3条评论
10个回答

61

就是这个:

<script type='text/javascript'>

function xmlToString(xmlData) { 

    var xmlString;
    //IE
    if (window.ActiveXObject){
        xmlString = xmlData.xml;
    }
    // code for Mozilla, Firefox, Opera, etc.
    else{
        xmlString = (new XMLSerializer()).serializeToString(xmlData);
    }
    return xmlString;
}   

</script>

这段内容摘自此处


2
我注意到在Firefox中将jQuery对象传递给此函数时出现了安全错误,但是当传递XML对象时似乎工作正常。 - Justin Ethier
在 Firefox 上出现了“NS_ERROR_XPC_BAD_CONVERT_JS:无法转换 JavaScript 参数 arg 0 [nsIDOMSerializer.serializeToString]”错误,IE 上也无法工作。 - SpaceDust__
1
对于现代的开发者来说,浏览器测试不应该只针对IE,而应该检查XMLSerializer的存在,因为较新版本的IE支持XMLSerializer,而较旧版本则不支持。 - BobbyTables

17

这可以解决.innerHtml的问题。

$('<div>').append(xmlObj).html()

3
这很好,但它会破坏标签的大小写(尤其在SOAP请求中明显)。<LogOnResponse>变成了<logonresponse>。 - Richard
如果您的DOM树中只有小写标签,那么这种方法比Serializer更好,因为Serializer可能会随意修改标签的命名空间。在我的特定情况下,Serializer方法没有返回正确的XML字符串,但$.html方法却可以。 - Michael Gollmick
迈克尔,你能解释一下$.html吗?我在大小写敏感方面遇到了很多困难。 - Laxminarayana Challagonda

5

为了解决这个问题,花费了很多时间。 在IE 9以上的版本中,功能应该以另一种方式工作。 因为在IE9中,xmlData[0].xml不起作用(IE还是喜欢开玩笑)。我们必须在IE v9及更高版本中使用XMLSerializer(?!)

function xmlToString(xmlData) { // this functions waits jQuery XML 

    var xmlString = undefined;

    if (window.ActiveXObject){
        xmlString = xmlData[0].xml;
    }

    if (xmlString === undefined)
    {
        var oSerializer = new XMLSerializer();
        xmlString = oSerializer.serializeToString(xmlData[0]);
    }

    return xmlString;
}

使用jQuery 1.8.2(1.6.4也可以)的示例。
   $.ajax(
        {
            type: type,
            url: url,
            data: values,
            dataType: 'html', //get response in plain text
            success: function(response) {    

                //transform it to jQuery XML DOM
                var xmlDoc = jQuery.parseXML(response);
                var xml = $(xmlDoc);

                //do some search and so on
                var divtag = xml.find('div[id="content"]');
                var divtxt = xmlToString(divtag);

                //consume it
                alert(divtxt);
                $('#main-content').html(divtxt);

            }
        });

很好!这段代码 var Serializer = new XMLSerializer(); xmlString = oSerializer.serializeToString(xmlData[0]); 可以在 IE9 中将 XML 解析为字符串。 - Juan Stoppa

5

这个方法对我有用(来源:http://www.ibm.com/developerworks/xml/tutorials/x-processxmljquerytut/section3.html):

 function getXmlAsString(xmlDom){
      return (typeof XMLSerializer!=="undefined") ? 
           (new window.XMLSerializer()).serializeToString(xmlDom) : 
           xmlDom.xml;
 }          

以下是一个从SharePoint列表中检索列信息的示例:
```html

这里是一个示例,用于从SharePoint列表中检索列信息:

```
var soapEnv =
    "<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/'> \
        <soapenv:Body> \
             <GetList xmlns='http://schemas.microsoft.com/sharepoint/soap/'> \
                <rowLimit>0</rowLimit> \
                <listName>Announcements</listName> \
            </GetList> \
        </soapenv:Body> \
    </soapenv:Envelope>";


jQuery.support.cors = true; 
$.ajax({
    url: "http://sharepoint/_vti_bin/lists.asmx",
    type: "POST",
    dataType: "xml",
    data: soapEnv,
    contentType: "text/xml; charset=\"utf-8\"",
    complete: function(xData){
        var xmlDoc = $.parseXML(xData.responseText), $xml = $(xmlDoc)           
        $Fields = $xml.find("Field");
        $field = $Fields.filter("Field[Name='Title']")[0];

        //Show the xml
        alert(getXmlAsString( xmlDoc ));
        alert(getXmlAsString( $field ));
    }
});

4
同样的问题我也遇到过——xmlString返回了一个空字符串。 在jQuery选择器后面添加[0]可以解决XML类型对象的问题:
您的Javascript代码:
<script type='text/javascript'>
function xmlToString(xmlData) 
{
    var xmlString;
    //IE
    if (window.ActiveXObject){
        xmlString = xmlData.xml;
    }
    // code for Mozilla, Firefox, Opera, etc.
    else{
        xmlString = (new XMLSerializer()).serializeToString(xmlData[0]);
    }
    return xmlString;
}   
</script>

jQuery:

<script>
$(function(){ 
  xmlData = "<tag>just a sample here</tag>"; 
  xmlData= $(xmlData); 
  if (window.ActiveXObject){ 
    var xmlString = xmlData.xml; 
  } else {
    var oSerializer = new XMLSerializer(); 
    var xmlString = oSerializer.serializeToString(xmlData[0]);
  } 
  console.log(xmlString); 
})
</script>

1
实际上,要使用jQuery正确解析XML,您需要使用jQuery.parseXML(xml) - Alexis Wilke
在创建了一个对象之后,即 let inputXObject = $.parseXML(...),(new XMLSerializer()).serializeToString(inputXObject) 只返回未格式化的 xml,无论是在 Windows 7、Chrome 还是 Chrome 控制台中。 - Sasha Bond

1
您可以使用以下函数:

function getXmlString($xmlObj)
{   
    var xmlString="";
    $xmlObj.children().each(function(){
        xmlString+="<"+this.nodeName+">";
        if($(this).children().length>0){
            xmlString+=getXmlString($(this));
        }
        else
            xmlString+=$(this).text();
        xmlString+="</"+this.nodeName+">";
    });
    return xmlString;
}

将jQuery XML对象传递到此函数中。

如果你坚持要自己序列化,那么在处理大型树形结构时性能会非常糟糕。建议将文本片段推入数组中,并仅在最后使用.join('')方法。 - epeleg

0

function serializeXML(xmldom) {
  if (typeof XMLSerializer != "undefined") {
    return (new XMLSerializer()).serializeToString(xmldom);
  } else if (typeof xmldom.xml != "undefined") {
    return xmldom.xml;
  } else {
    throw new Error("Could not serialize XML DOM.");
  }
}

// test
var xml = "<rss version='2.0'><channel><title>RSS Title</title></channel></rss>",
  xmlDoc = $.parseXML(xml),
  xmlStr = serializeXML(xmlDoc);
console.log("xmlStr: " + xmlStr);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


-1

就我的情况而言

if(window.ActiveXObject){
    xmlString = xmlData.xml;
}

无法工作。这是与IE10有关的问题。

因此,我可以按照以下方式解决此问题:

if(window.ActiveXObject){
    xmlString = xmlData.attr('xml');
}

并且可以在任何浏览器上正常工作。


-1

虽然这是一篇旧帖子,但我想提出以下建议:

xml[0].outerHTML

一个XML文档为什么会有一个名为outerHTML的字段? - Alexis Wilke
这不是一个 XML 文档,而是一个 jQuery 对象。 - Armand
XML对象没有它...您可以使用xml.documentElement.outerHTML,但它返回非格式化的XML字符串。 - Sasha Bond

-2

只需将xml作为jQuery对象的属性值访问即可。就是这么简单。


4
应该只是一条评论,就这么简单。如果你要回答,请至少给出一个例子。 - Mickäel A.

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