如果您采用 XML 字符串,其中 CDATA 元素以正确的结构嵌入到 CDATA 元素中。 (其中“]]”的嵌入式 CDATA 结束表示为“]]]]>]]>”
然后执行往返 xmlString -> DOMParser() -> XMLSerializer() -> xmlString 与类似的东西 ... var parser = new DOMParser(); var resultDocument = parser.parseFromString(sourceXMLString, 'text/xml');
var 序列化器 = new XMLSerializer(); var resultXMLString = serializer.serializeToString(resultDocument); ...
Edge/Chrome 中生成的 XML 字符串不正确 IE。 “]]>”
因此它丢失了']]]]>的嵌入式CDATA关闭的正确编码
Firefox 和 Safari 结果是相同的。
此外,来自 parser.parseFromString(sourceXMLString, 'text/xml') 的 resultDocument 事实上,由于 XSL 运行失败,它已损坏
是否可以控制 DOMParser 的 chromium 版本上的 parseFromString 方法的行为以获得正确的结果?
这是一个非常简单的 html 片段,清楚地显示了问题,尝试在 Chrome/Edge 与 Firefox/Safari 中运行它以查看行为
<html>
<body>
<p id="demo"></p>
<script>
const simpleXML = "<root><element>Element Data</element></root>";
const cdataXML = "<root><htmlDef><![CDATA[<html><body><div></div></body></html>]]></htmlDef></root>";
const embeddedCDATAXML = "<root><htmlDefn><![CDATA[<div><![CDATA[ Just Rubbish Data $#$^#^$ ]]]]><![CDATA[></div><div></div>]]></htmlDefn></root>";
function testRoundTrip(sourceXMLString) {
var parser = new DOMParser();
var resultDocument = parser.parseFromString(sourceXMLString, 'text/xml');
var serializer = new XMLSerializer();
var resultXMLString = serializer.serializeToString(resultDocument);
if (sourceXMLString === resultXMLString) {
window.alert("Round Trip XML String to DOM and Back matches perfectly");
window.alert("SOURCE : " + sourceXMLString);
} else {
window.alert("Round Trip XML String to DOM and Back DOES NOT MATCH");
window.alert("SOURCE : " + sourceXMLString);
window.alert("RESULT : " + resultXMLString);
}
}
</script>
<h1>Test some XML Parsing Round Trips (In Different Browsers)</h1>
<h2>Using the Browser Built-in DOMParser() and XMLSerializer()</h2>
<button type="button" onclick="testRoundTrip(simpleXML)">Simple XML</button>
<button type="button" onclick="testRoundTrip(cdataXML)">XML with CDATA</button>
<button type="button" onclick="testRoundTrip(embeddedCDATAXML)">XML with Embedded CDATAs</button>
</body>
</html>
这可能是由 Chromium 解决 libxml2 中的 问题造成的。