Omettre des instructions de traitement XML lors de la sérialisation d’un object

Je sérialise un object dans une application C # VS2003 / .Net 1.1. J’ai besoin de lui sérialisé sans l’instruction de traitement, cependant. La classe XmlSerializer affiche quelque chose comme ceci:

  Data More Data  

Est-il possible d’obtenir quelque chose comme ce qui suit, sans traiter le texte résultant pour supprimer la balise?

  Data More Data  

Pour ceux qui sont curieux, mon code ressemble à ceci …

 XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); SsortingngBuilder builder = new SsortingngBuilder(); using ( TextWriter ssortingngWriter = new SsortingngWriter(builder) ) { serializer.Serialize(ssortingngWriter, comments); return builder.ToSsortingng(); } 

Le lien suivant vous mènera à un poste dans lequel une personne dispose d’une méthode permettant de supprimer l’instruction de traitement en utilisant XmlWriter et en passant à un état “Élément” plutôt qu’à un état “Début”. Cela fait que l’instruction de traitement ne soit pas écrite.

Supprimer l’instruction de traitement

Si vous transmettez un XmlWriter au sérialiseur, celui-ci n’émettra une instruction de traitement que si l’état de XmlWriter est ‘Démarrer’ (c’est-à-dire qu’il n’a encore rien écrit).

 // Assume we have a type named 'MyType' and a variable of this type named 'myObject' System.Text.SsortingngBuilder output = new System.Text.SsortingngBuilder(); System.IO.SsortingngWriter internalWriter = new System.IO.SsortingngWriter(output); System.Xml.XmlWriter writer = new System.Xml.XmlTextWriter(internalWriter); System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(typeof(MyType)); writer.WriteStartElement("MyContainingElement"); serializer.Serialize(writer, myObject); writer.WriteEndElement(); 

Dans ce cas, l’écrivain sera dans un état ‘Élément’ (à l’intérieur d’un élément), aucune instruction de traitement ne sera écrite. Une fois que vous avez fini d’écrire le code XML, vous pouvez extraire le texte du stream sous-jacent et le traiter comme il convient.

J’ai fait une petite correction

 XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); SsortingngBuilder builder = new SsortingngBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; using ( XmlWriter ssortingngWriter = XmlWriter.Create(builder, settings) ) { serializer.Serialize(ssortingngWriter, comments); return builder.ToSsortingng(); } 

En 2.0, vous utiliseriez XmLWriterSettings.OmitXmlDeclaration et vous sérialisiez sur un XmlWriter – cependant, je ne pense pas que cela existe dans la version 1.1; donc pas tout à fait utile – mais juste une autre chose “envisager une mise à niveau” … et oui, je réalise que ce n’est pas toujours possible.

Qu’en est-il d’omettre des espaces de noms?

à la place d’utiliser

 XmlSerializerNamespaces namespaces = new XmlSerializerNamespaces(); namespaces.Add("", ""); 

ex:

  

Si, par “instruction de traitement”, vous entendez la déclaration xml, vous pouvez éviter cela en définissant la propriété OmitXmlDeclaration de XmlWriterSettings. Pour ce faire, vous devrez sérialiser à l’aide d’un XmlWriter.

 XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); SsortingngBuilder builder = new SsortingngBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.OmitXmlDeclaration = true; using ( XmlWriter ssortingngWriter = new SsortingngWriter(builder, settings) ) { serializer.Serialize(ssortingngWriter, comments); return builder.ToSsortingng(); } 

Mais ah, cela ne répond pas à votre question pour 1.1. Eh bien, pour référence aux autres.

Cela fonctionne dans .NET 1.1. (Mais vous devriez quand même envisager une mise à niveau)

  XmlSerializer s1= new XmlSerializer(typeof(MyClass)); XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add( "", "" ); MyClass c= new MyClass(); c.PropertyFromDerivedClass= "Hallo"; sw = new System.IO.SsortingngWriter(); s1.Serialize(new XTWND(sw), c, ns); .... /// XmlTextWriterFormattedNoDeclaration /// helper class : eliminates the XML Documentation at the /// start of a XML doc. /// XTWFND = XmlTextWriterFormattedNoDeclaration public class XTWFND : System.Xml.XmlTextWriter { public XTWFND(System.IO.TextWriter w) : base(w) { Formatting = System.Xml.Formatting.Indented; } public override void WriteStartDocument() { } }