【问题标题】:Convert xml to string with jQuery使用 jQuery 将 xml 转换为字符串
【发布时间】:2011-06-28 13:34:45
【问题描述】:

我正在使用 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
  • 您是要从 xml 中提取特定字符串,还是只是获取从 AJAX 请求返回的 xml 字符串?
  • @Ryan- 前者- 虽然我将保存整个 xml 文档,但我需要先对其执行操作,所以我需要将其作为 xml 引入
  • @Blindy-您不能在 xml 上使用 .html(),而只是 xml 返回 = [object Document]
  • 如果不需要解析XML而只获取文本,将dataType改为'text'

标签: jquery xml xml-serialization tostring


【解决方案1】:

这里是:

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

取自here

【讨论】:

  • 我注意到在 Firefox 中将 jQuery 对象传递给此函数时出现安全错误,但在传递 XML 对象时似乎工作正常。
  • NS_ERROR_XPC_BAD_CONVERT_JS: Could not convert JavaScript argument arg 0 [nsIDOMSerializer.serializeToString] Firefox 上的错误,在 IE 上也不起作用
  • 对于那些正在研究这个解决方案的现代人来说,浏览器测试不应该针对 IE,而应该针对 XMLSerializer 的存在,因为较新的 IE 有这个,但不是较旧的。
【解决方案2】:

这可以解决 .innerHtml 问题。

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

【讨论】:

  • 这很好,但它会破坏标签上的大小写。 (在 SOAP 请求上尤其明显。) 因为
  • 如果你的 DOM 树中只有小写的标签,这个比序列化器方法更好,因为序列化器可以随意修改带有自己命名空间的标签。在我的特殊情况下,Serializer 方法没有返回正确的 xml 字符串,但 $.html 方法返回了。
  • Michael 你能解释一下 $.html 在区分大小写方面遇到了很多困难
【解决方案3】:

这对我有用(信用: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 列表中检索列信息的示例:

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】:

    花了很多时间解决这个问题。 对于 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]); 将 XML 解析为 IE9 中的字符串
    【解决方案5】:

    遇到了同样的问题 - xmlString 返回一个空字符串。 将 [0] 添加到 jQuery 选择器有助于解决 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>
    

    【讨论】:

    • 其实,要想用jQuery正确解析XML,你要使用jQuery.parseXML(xml)
    • 在 let inputXObject = $.parseXML(...) 创建一个对象后, (new XMLSerializer()).serializeToString(inputXObject) 只返回 xml,没有格式化(windows 7、Chrome、Chrome 控制台为好)
    【解决方案6】:

    您可以使用以下功能:

    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('') 一次。
    【解决方案7】:

    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);
    &lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

    【讨论】:

      【解决方案8】:

      我知道的一篇旧帖子,但我想我会建议这样做:

      xml[0].outerHTML
      

      【讨论】:

      • 为什么 XML 文档会有一个名为 outerHTML 的字段?
      • 它不是一个 XML 文档,它是一个 jQuery 对象。
      • xml 对象没有它.. 你可以使用 xml.documentElement.outerHTML,但它返回非格式化的 xml 字符串
      【解决方案9】:

      就我而言

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

      不工作。这是 IE10 的问题。

      所以我可以按如下方式解决此问题:

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

      在任何浏览器上都能正常工作。

      【讨论】:

        【解决方案10】:

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

        【讨论】:

        • 应该是评论,就这么简单。如果你回答,至少举个例子。
        猜你喜欢
        • 2013-06-20
        • 2011-09-03
        • 1970-01-01
        • 2018-08-29
        • 1970-01-01
        • 1970-01-01
        • 2012-10-26
        • 1970-01-01
        • 2011-03-06
        相关资源
        最近更新 更多