尝试解析字符串时出现 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
元素而设计的,而是为了保存可能包含 <
、>
等字符的字符数据,这允许我们避免将它们分别转义为 <
、>
,并以干净的方式编写和显示它们。
因此<![CDATA[
和]]
之间的内容将视为纯文本,不作进一步处理,即使它看起来有一个 hierarchy 。换句话说,它们是纯字符串。让我们以您的代码为例:
var cont = "<op><![CDATA[ <foo><bar></bar></foo> ]]></op>";
var xml=XElement.Parse(cont);
此处 xml
的 FirstNode
将是纯文本 foo><bar></bar></foo>
,FirstNode
的 FirstNode
将是 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>");
我在尝试解析字符串(在 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
元素而设计的,而是为了保存可能包含 <
、>
等字符的字符数据,这允许我们避免将它们分别转义为 <
、>
,并以干净的方式编写和显示它们。
因此<![CDATA[
和]]
之间的内容将视为纯文本,不作进一步处理,即使它看起来有一个 hierarchy 。换句话说,它们是纯字符串。让我们以您的代码为例:
var cont = "<op><![CDATA[ <foo><bar></bar></foo> ]]></op>";
var xml=XElement.Parse(cont);
此处 xml
的 FirstNode
将是纯文本 foo><bar></bar></foo>
,FirstNode
的 FirstNode
将是 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>");