尝试解析字符串时出现 XElement 解析错误

XElement Parse error when trying to parse string

我在尝试解析字符串(在 CDATA 中使用 CDATA)时遇到 xml 解析错误

var cont = "<op><![CDATA[someData<p><![CDATA[someotherData]]></p></op>";
XElement.Parse(cont);

错误:

The 'op' start tag on line 1 position 2 does not match the end tag of 'p'. Line 1, position 52.

我们可以在 CDATA 中包含 CDATA 吗?如果可以,那为什么我会收到错误。

下面的代码工作正常(CDATA 中不包含 CDATA)。

var cont = "<op><![CDATA[someData]]</op>";
XElement.Parse(cont);
1  <op>
2      <![CDATA[
3          someData
4          <p>
5              <![CDATA[someotherData]]>
6          </p>
7  </op>

当 XML 解析器在第 5 行遇到 ]]> 时,它将终止它在第 2 行遇到的第一个 <![CDATA[。因此,您永远无法在 CDATA 中嵌套 CDATA

CDATA 不是为了保存 xml 元素而设计的,而是为了保存可能包含 <> 等字符的字符数据,这允许我们避免将它们分别转义为 &lt;&gt;,并以干净的方式编写和显示它们。

因此<![CDATA[]]之间的内容将视为纯文本,不作进一步处理,即使它看起来有一个 hierarchy 。换句话说,它们是纯字符串。让我们以您的代码为例:

var cont = "<op><![CDATA[ <foo><bar></bar></foo> ]]></op>";
var xml=XElement.Parse(cont);

此处 xmlFirstNode 将是纯文本 foo><bar></bar></foo>FirstNodeFirstNode 将是 null .

由于解析器总是将 <![CDATA[]] 之间的数据视为纯字符串,因此没有 "standard" 最接近的有效方式来表示它们。只需对它们进行编码和解码。例如,我们可以对数据进行 urlencode :

string xmlstr= @"<op><![CDATA[
    <helloworld/>
    someData%0A%3Cp%3E%0A%3C!%5BCDATA%5BsomeotherData%5D%5D%3E%0A%3C%2Fp%3E
]]></op>";
var xml = XElement.Parse(xmlstr);

var subxmlString=System.Web.HttpUtility.UrlDecode(xml.Value);
// make sure there' must be a root element
var subxml= XElement.Parse($"<root>${subxmlString}</root>");