【问题标题】:XElement Parse error when trying to parse string尝试解析字符串时出现 XElement Parse 错误
【发布时间】:2018-09-20 18:10:37
【问题描述】:

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

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);

【问题讨论】:

  • 对...这不是有效的 xml。结束 &lt;/p&gt; 标记应该对应于什么?
  • @JeffMercado 那么在我的情况下,最接近的有效 xml 是什么?

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


【解决方案1】:
1  <op>
2      <![CDATA[
3          someData
4          <p>
5              <![CDATA[someotherData]]>
6          </p>
7  </op>

当 XML Parser 在第 5 行遇到 ]]&gt; 时,它将终止在第 2 行遇到的第一个 &lt;![CDATA[。因此,您永远不能将CDATA 嵌套在CDATA

CDATA 不是用来保存 xmlelements 的,而是用来保存可能包含 &amp;lt;&amp;gt; 等字符的字符数据,这样我们就可以避免将它们转义为 &amp;lt;&amp;gt; 分别写出来并以干净的方式显示出来。

所以&lt;![CDATA[]]之间的内容被视为纯文本,无需进一步处理,即使看起来有层次结构。换句话说,它们是纯字符串。让我们以您的代码为例:

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

这里xmlFirstNode 将是纯文本foo&gt;&lt;bar&gt;&lt;/bar&gt;&lt;/foo&gt;FirstNodeFirstNode 将是null

由于解析器将始终将&lt;![CDATA[]] 之间的数据视为纯字符串,因此没有“标准”最接近的有效方式来表示它们。只需对它们进行编码和解码。例如,我们可以对数据进行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>");  

【讨论】:

  • 感谢您的详细解释。
猜你喜欢
  • 2016-06-16
  • 2014-05-28
  • 1970-01-01
  • 2022-01-16
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多