【问题标题】:XmlWriter.WriteCData throws an ArgumentException - invalid characterXmlWriter.WriteCData 引发 ArgumentException - 无效字符
【发布时间】:2011-02-03 23:31:56
【问题描述】:
StringBuilder output = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(output))
{
    writer.WriteStartElement("test");
    writer.WriteCData("taco\vbell");
    writer.WriteEndElement();
    writer.WriteEndDocument();
}

Console.WriteLine(output.ToString());

WriteCData 抛出以下 ArgumentException,“'\v',十六进制值 0x0B,是无效字符”

我认为 CData 可以获取任何类型的数据。既然不是这样,我必须逃避什么角色?谢谢。

【问题讨论】:

  • 伙计们-感谢您提供的信息。这帮助很大。

标签: c# .net xml


【解决方案1】:

不,XML 本身不能表示任何早于 U+0020 的字符,除了制表符、回车符和换行符。

来自the specsection 2.2

字符范围

字符 ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* 任何 Unicode 字符,不包括代理块、FFFE 和 FFFF。 */

不幸的是,没有标准的方式来表示“禁止”字符。您必须创建自己的转义机制。

【讨论】:

    【解决方案2】:

    我建议查看http://www.w3.org/TR/REC-xml/#dt-cdsection 以了解允许的特定字符。这将向您展示 XML 中允许的内容(这将向您展示 0x0B 是不允许的)。您是否需要按原样维护此内容?如果没有,我会推荐Base64 encoding,这样你就可以安全了。

    【讨论】:

      【解决方案3】:

      可能只有在您无法控制需要此类恶作剧的消费者时才需要,但在这种紧要关头,您可以禁用 XmlWriter 的字符检查机制:

      XmlWriterSettings s = new XmlWriterSettings();
      s.CheckCharacters = false;
      using (XmlWriter writer = XmlWriter.Create(output, s)){...}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-16
        • 2017-04-23
        • 1970-01-01
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-26
        相关资源
        最近更新 更多