2011-02-03 4 views
7
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, это неверный символ»XmlWriter.WriteCData бросает ArgumentException - неверный символ

Я думал CDATA может принимать любые данные. Так как это не так, какими персонажами я должен бежать? Благодарю.

+0

Guys - Спасибо за информацию. Это помогло много. – James

ответ

9

Нет, сам XML не может представлять символы раньше, чем U + 0020, кроме табуляции, возврата каретки и перевода строки.

От the spec, section 2.2:

Диапазон символов

Char :: = # x9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# x10000- # x10FFFF]/* любой символ Юникода, за исключением суррогатных блоков, FFFE и FFFF. */

Нет, к сожалению, стандартного способа представления «запрещенных» символов. Вам нужно будет создать свой собственный механизм экранирования.

2

Я бы рекомендовал проверить http://www.w3.org/TR/REC-xml/#dt-cdsection для определенных символов. Это покажет вам, что разрешено в XML (и это покажет вам, что 0x0B не разрешено). Вам требуется, чтобы этот контент поддерживался как есть? Если нет, я бы порекомендовал Base64 encoding, чтобы вы могли быть в безопасности.

1

Вероятно, только если вы не имеете никакого контроля над потребителем, который, требующий таких махинаций, но в таком крайнем случае, вы можете отключить символьный механизм проверки на XMLWriter в:

XmlWriterSettings s = new XmlWriterSettings(); 
s.CheckCharacters = false; 
using (XmlWriter writer = XmlWriter.Create(output, s)){...} 
Смежные вопросы