2010-06-11 2 views
2

Nous créons un système fournissant des données à un schéma XML. Certains des champs de ce schéma doivent être conservés, car ils seront analysés par le système d'extrémité dans une mise en page Word doc. Pour ce faire, nous utilisons des balises <![CDATA[Some formatted text]]> dans le fichier App.Config, puis nous l'insérons dans un champ de propriété approprié dans une classe générée par xsd.exe à partir de notre schéma. Idéalement, le formatage ne serait pas un problème, mais malheureusement c'est juste comment le système fonctionne.Arrêter les balises CDATA d'être échappées en sortie lors de l'écriture au format XML en C#

La section App.Config se présente comme suit:

<header> 
<![CDATA[Some sample formatted data]]> 
</header> 

L'affectation de données se présente comme suit:

HeaderSection header = ConfigurationManager.GetSection("header") as HeaderSection; 
report.header = "<[CDATA[" + header.Header + "]]>"; 

Enfin, la sortie de Xml est traitée comme suit:

xs = new XmlSerializer(typeof(report)); 
fs = new FileStream (reportLocation, FileMode.Create); 
xs.Serialize(fs, report); 
fs.Flush(); 
fs.Close(); 

Cela devrait en théorie produire dans le Xml final une section qui contient des informations avec des balises CDATA. Cependant, les parenthèses inclinées sont en train d'être converties en &lt; et &gt;

J'ai examiné les moyens de désactiver Outout Escaping, mais jusqu'à présent, je ne trouve que des références aux feuilles XSLT. J'ai aussi essayé @"<[CDATA[" avec les cordes, mais encore une fois pas de chance.

Toute aide serait appréciée!

+0

Pour obtenir la mise en forme de code (qui permet '<' etc) en ligne dans un paragraphe, vous pouvez utiliser des backquotes (comme dans mon édition) – AakashM

Répondre

4

Vous confondez le balisage avec le contenu.

Lorsque vous attribuez la chaîne "<![CDATA[ ... ]]>" à la valeur, vous dites que le contenu est que vous souhaitez mettre là-dedans. Le XmlSerializer ne cherche pas, et ne devrait même pas, déduire une sémantique de balisage à partir de ce contenu, et l'échappe simplement selon les règles normales.

Si vous souhaitez que le balisage CDATA corresponde à, vous devez indiquer explicitement au sérialiseur de le faire. Quelques exemples de la façon de faire sont here.

+0

Cela semble être la solution la plus probable. Il semble juste étrange que je ne peux pas prendre le CDATA de App.Config et le transférer directement. Je peux voir d'où vous venez avec le problème du balisage/contenu. La classe Xsd a été générée automatiquement, donc un peu plus difficile que d'habitude d'attribuer un nœud comme [XmlIgnore] (la méthode recommandée dans le lien que vous avez fourni), mais j'espère que cela devrait fonctionner. Merci pour la suggestion! – Smallgods

0

Avez-vous essayé de changer

report.header = "<[CDATA[" + header.Header + "]]>"; 

à

report.header = "<![CDATA[" + header.Header + "]]>"; 
Questions connexes