Chromium xmlString -> DOMParser() -> XMLSerializer() 嵌入 CDATA 的往返失败

问题描述 投票:0回答:1

如果您采用 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>
javascript chromium cdata domparser
1个回答
0
投票

这可能是由 Chromium 解决 libxml2 中的 问题造成的

© www.soinside.com 2019 - 2024. All rights reserved.