S. Lott 的回答是正确的:您不对结束标签进行编码,而是将其拆分为多个 CDATA 部分。
如何在现实世界中解决这个问题:使用 XML 编辑器创建一个将输入内容管理系统的 XML 文档,尝试写一篇关于 CDATA 部分的文章。您在 CDATA 部分中嵌入代码示例的普通技巧将在这里失败。你可以想象我是如何学会这个的。
但在大多数情况下,您不会遇到这种情况,原因如下:如果您想将 XML 文档的文本存储(例如)为 XML 元素的内容,您可能会使用 DOM 方法,例如:
XmlElement elm = doc.CreateElement("foo");
elm.InnerText = "<[CDATA[[Is this a problem?]]>";
并且 DOM 相当合理地转义了 < 和 >,这意味着您没有无意中在文档中嵌入了 CDATA 部分。
哦,这很有趣:
XmlDocument doc = new XmlDocument();
XmlElement elm = doc.CreateElement("doc");
doc.AppendChild(elm);
string data = "<![[CDATA[This is an embedded CDATA section]]>";
XmlCDataSection cdata = doc.CreateCDataSection(data);
elm.AppendChild(cdata);
这可能是 .NET DOM 的一种理念,但这不会引发异常。这里抛出异常:
Console.Write(doc.OuterXml);
我猜想,幕后发生的事情是 XmlDocument 正在使用 XmlWriter 生成其输出,并且 XmlWriter 在写入时检查格式是否正确。