Мое приложение генерирует XML с использованием XmlDocument. Некоторые данные содержат символы новой строки и возврата каретки.
Когда текст назначается элементу Xml следующим образом:
e.InnerText = "Hello\nThere";
Полученный XML выглядит так:
<e>Hello
There</e>
Получатель XML (который я не могу контролировать) обрабатывает новую строку как пробел и видит приведенный выше текст как:
"Hello There"
Чтобы получатель сохранил новую строку, он должен иметь следующую кодировку:
<e>Hello
There</e>
Если данные применяются к XmlAttribute, новая строка правильно кодируется.
Я пытался применить текст к XmlElement, используя InnerText и InnerXml, но вывод одинаков для обоих.
Есть ли способ получить текстовые узлы XmlElement для вывода новых строк и возврата каретки в их закодированных формах?
Вот пример кода для демонстрации проблемы:
string s = "return[\r] newline[\n] special[&<>\"']";
XmlDocument d = new XmlDocument();
d.AppendChild( d.CreateXmlDeclaration( "1.0", null, null ) );
XmlElement r = d.CreateElement( "root" );
d.AppendChild( r );
XmlElement e = d.CreateElement( "normal" );
r.AppendChild( e );
XmlAttribute a = d.CreateAttribute( "attribute" );
e.Attributes.Append( a );
a.Value = s;
e.InnerText = s;
s = s
.Replace( "&" , "&" )
.Replace( "<" , "<" )
.Replace( ">" , ">" )
.Replace( "\"", """ )
.Replace( "'" , "'" )
.Replace( "\r", "
" )
.Replace( "\n", "
" )
;
e = d.CreateElement( "encoded" );
r.AppendChild( e );
a = d.CreateAttribute( "attribute" );
e.Attributes.Append( a );
a.InnerXml = s;
e.InnerXml = s;
d.Save( @"C:\Temp\XmlNewLineHandling.xml" );
Вывод этой программы:
<?xml version="1.0"?>
<root>
<normal attribute="return[
] newline[
] special[&<>"']">return[
] newline[
] special[&<>"']</normal>
<encoded attribute="return[
] newline[
] special[&<>"']">return[
] newline[
] special[&<>"']</encoded>
</root>
Заранее спасибо.
Крис.