尝试解析字符串时,XElement解析错误

时间:2018-09-20 18:10:38

标签: xml-parsing asp.net-core-2.0 xelement

尝试解析字符串(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 个答案:

答案 0 :(得分:1)

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[]] 之间的内容将视为纯文本,无需进一步处理,即使看起来好像存在层次结构< / strong>。换句话说,它们是纯字符串。让我们以您的代码为例:

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

此处FirstNode的{​​{1}}将是纯文本xml,而foo><bar></bar></foo>的{​​{1}}将是FirstNode

由于解析器将始终将FirstNodenull之间的数据视为纯字符串,因此没有“标准”最接近的有效方式来表示它们。只需对其进行编码并对其进行解码。例如,我们可以对数据进行urlencode:

<![CDATA[