【问题标题】:Why .NET XML API doesn't protect me from null character?为什么 .NET XML API 不能保护我免受空字符的影响?
【发布时间】:2009-12-18 10:22:21
【问题描述】:

我的应用程序从外部接收字符串并构造一个 XML 文档

string fromOutside = "\0";
XAttribute a = new XAttribute(fromOutside);

当属性值包含空字符时,我在尝试将 XML 保存到磁盘时遇到异常(当它进入 XmlWriter 时)

System.ArgumentException : '.', hexadecimal value 0x00, is an invalid character.

即使 SecurityElement 类也无济于事

Assert.IsFalse(SecurityElement.IsValidAttributeValue("\0"));

从可能包含无效字符(如空字符等)的字符串构造 XML 文档的最佳方法是什么?

【问题讨论】:

    标签: .net xml xml-serialization escaping special-characters


    【解决方案1】:

    您不能转义非打印字符,例如 NULL,因为没有为它们定义等效的转义字符。除非您有 HEX 或 Base64 编码片段,否则您无法表示它。因此,您可以对字符串进行 Base64 编码,也可以确保它不包含非打印字符。

    string fromOutside = "\0";
    string base64Encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(fromOutside));
    XAttribute a = new XAttribute("id", base64Encoded);
    

    【讨论】:

    • 所以在我的情况下,唯一的方法是解析字符串并删除空字符,不是吗? :-(
    • 不,你也可以对字符串进行 Base64 编码:Convert.ToBase64String(Encoding.UTF8.GetBytes(fromOutside))
    • Base64 对我来说不是一个选项,因为我必须在结果 XML 中保持字符串可读。字符串的示例可以是“\0My\0 fancy val\0ue\0\0\0”。
    • 好吧,那么您将不得不推出自己的函数,将每个不可打印的字符替换为\\CODE
    【解决方案2】:

    我还发现了一篇不错的博文,作者提供了从字符串中删除无效不可打印字符的代码

    http://seattlesoftware.wordpress.com/2008/09/11/hexadecimal-value-0-is-an-invalid-character/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2017-05-18
      • 1970-01-01
      • 2011-08-17
      • 2018-07-24
      • 2015-10-26
      • 1970-01-01
      相关资源
      最近更新 更多