Почему .NET XML API не защищает меня от нулевого символа? - PullRequest
2 голосов
/ 18 декабря 2009

Мое приложение получает строки извне и создает 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-документа из строк, которые могут содержать такие недопустимые символы, как нулевой символ и т. Д.

Ответы [ 2 ]

2 голосов
/ 18 декабря 2009

Вы не можете экранировать непечатные символы, такие как NULL, потому что для них не определены эквивалентные экранирующие символы. Вы не можете представить его, если у вас нет фрагментов в кодировке HEX или Base64. Таким образом, вы можете либо кодировать строку Base64, либо убедиться, что она не содержит непечатаемых символов.

string fromOutside = "\0";
string base64Encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(fromOutside));
XAttribute a = new XAttribute("id", base64Encoded);
0 голосов
/ 18 декабря 2009

Я также нашел хороший пост в блоге, где автор предоставил код для удаления недопустимых непечатаемых символов из строк

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

...