Échapper les caractères de nouvelle ligne avec XmlDocument

Mon application génère le XML à l'aide de XmlDocument. Certaines données contient un saut de ligne et retour chariot caractères.

Lorsque le texte est attribué à un XmlElement comme ceci:

   e.InnerText = "Hello\nThere";

Le XML résultant ressemble à ceci:

<e>Hello
There</e>

Le récepteur de l'XML (dont je n'ai pas le contrôle) traite de la nouvelle ligne comme un espace blanc et voit le texte ci-dessus:

 "Hello There"

Pour le récepteur de conserver la nouvelle ligne, il nécessite le codage:

<e>Hello&#xA;There</e>

Si les données sont appliquées à un XmlAttribute, la nouvelle ligne est codé correctement.

J'ai essayé d'appliquer du texte à XmlElement à l'aide d'InnerText et InnerXml mais le résultat est le même pour les deux.

Est-il un moyen d'obtenir XmlElement les nœuds de texte pour la sortie de nouvelles lignes et de transport, est de retour dans leurs codées formes?

Voici un exemple de code pour illustrer le problème:

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( "&" , "&amp;"  )
    .Replace( "<" , "&lt;"   )
    .Replace( ">" , "&gt;"   )
    .Replace( "\"", "&quot;" )
    .Replace( "'" , "&apos;" )
    .Replace( "\r", "&#xD;"  )
    .Replace( "\n", "&#xA;"  )
;
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" );

La sortie de ce programme est:

<?xml version="1.0"?>
<root>
  <normal attribute="return[&#xD;] newline[&#xA;] special[&amp;&lt;&gt;&quot;']">return[
] newline[
] special[&amp;&lt;&gt;"']</normal>
  <encoded attribute="return[&#xD;] newline[&#xA;] special[&amp;&lt;&gt;&quot;']">return[
] newline[
] special[&amp;&lt;&gt;"']</encoded>
</root>

Merci à l'avance.
Chris.

Ce que vous voulez n'est pas clair. Merci de montrer ce que vous voulez, et ce que vous
Regardez le top 4 lignes de code: ce que j'avais au début, ce que je suis, ce que le récepteur voit, ce que je veux. Les attributs de coder des retours à la ligne comme je le veux, les Éléments ne sont pas.

OriginalL'auteur Chris C. | 2011-03-01