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() + "";
代替