尝试解析字符串(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);
答案 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
元素,而是用于容纳可能包含诸如<
,>
等字符的字符数据,这使我们能够避免将它们分别转义为<
和>
,并以清晰的方式编写和显示它们。
因此, <![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
。
由于解析器将始终将FirstNode
和null
之间的数据视为纯字符串,因此没有“标准”最接近的有效方式来表示它们。只需对其进行编码并对其进行解码。例如,我们可以对数据进行urlencode:
<![CDATA[