JQuery XML解析:替换标签

我有以下XML:

  Lorem ipsum dolor sit amet.  

我正在尝试使用JQuery解析此XML并使用标记替换响应中的 标记。 结果字符串应为"Lorem ipsum dolor sit amet."

我正在对XML执行GET请求,如下所示:

  $.ajax({ type: "GET", url: "response.xml", dataType: "xml", success: function(xml){ } }); 

我已经尝试过这样调用replaceWith函数:

 $(xml).find("foo").replaceWith(function(){ return "" + $(this).text() + ""; }); 

但这将完全从xml响应中删除文本。 有什么我想念的吗?

编辑:Firebug显示以下错误:

这[0] .innerHTML未定义

我建议您使用Web浏览器的XML DOM而不是滥用jQuery,它是用来处理HTML的。 以下是将XML解析为DOM的方法:

 var xmlDoc; if (window.DOMParser) { var parser = new DOMParser(); xmlDoc = parser.parseFromString(xml, "text/xml"); } else // Internet Explorer { xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async = "false"; xmlDoc.loadXML(xml); } // Now do the tedious DOM manipulations on xmlDoc var foos = xmlDoc.getElementsByTagName('foo'); for (var i = 0; i < foos.length; i++) { var oldElem = foos[i]; var replacement = xmlDoc.createElement("b"); replacement.appendChild(xmlDoc.createTextNode(oldElem.childNodes[0].nodeValue)); oldElem.parentNode.replaceChild(replacement, oldElem); } 

编辑

另一种可能性是使用客户端XSLT将XML转换为所需的HTML。 使用这样的XSLT文档:

                

您可以将样本输入转换为带有b标记的范围。 如果你有很多转换规则,那么XSLT可能比一堆糟糕的DOM操作代码更易于维护。

这似乎对我在Firebug控制台中直接使用XML字符串起作用:

 var xml = $('Lorem ipsum dolor sit amet.'); xml.find('foo').replaceWith(function(){ console.log(this); return ''+$(this).text()+''; }); console.log(xml); 

你的成功function还会发生什么?

jQuery是一个基于HTML的库,处理XML(或一般的跨文档脚本)的能力有限。

有些方法可行:对XML的find()text()通常都可以。 但是当你返回像foo这样的标记字符串时,jQuery会将其用作HTML内容,并尝试将其写入元素的innerHTML 。 但是XML文档不是HTML,因此不支持innerHTML ,因此jQuery失败。

在任何情况下,您都不希望获取元素的text()并将其逐字地用作标记。 如果该文本包含<&字符怎么办? 这会破坏标记并可能为您提供跨站点脚本漏洞。 不要使用天真的字符串吊索来准备HTML。

相反,使用DOM风格的方法。 像replace()这样的jQuery方法可以做到这一点,但是你不能使用简单的replace('')因为jQuery会再次使用''并将其转换为由HTML拥有的HTML粗体元素。当前的HTML文档,然后尝试将该HTML元素插入到XML文档中,这将无法正常工作。 相反,您需要使用XML DOM手动创建元素:

 $(xml).find("foo").each(function() { var b= xml.createElement('b'); this.parentNode.replaceChild(b, this); while (this.firstChild) b.appendChild(this.firstChild); }); 

这会更改XML文档。 但是,如果你要做的是将XML文档转换为可用的HTML,那么这似乎并没有帮助你。 使用序列化器(依赖浏览器)转换回XML标记会产生不一定与HTML兼容的标记(例如,空标签可能会自动关闭)。

要将XML元素可靠地导入HTML,最好手动完成。 (有importNode ,但IE不支持它。)例如:

 function xmlToDocument(node, dest) { if (node.nodeType===1) { // Create HTML element from XML element. Change name if 'foo'. // var tag= node.tagName.toLowerCase()==='foo'? 'b' : node.tagName; var el= document.createElement(tag); dest.appendChild(el); // Copy attributes // for (var attri= node.attributes.length; attri-->0;) { var attr= node.attributes[attri]; el.setAttribute(attr.name, attr.value); } // Copy element contents // for (var child= node.firstChild; child!==null; child= child.nextSibling) xmlToDocument(child, el); } else if (node.nodeType===3) dest.appendChild(document.createTextNode(node.)); } 

您知道...在JSON对象中返回一些HTML标记可能更容易。

尝试使用

 return "" + $(this).html() + ""; 

代替