2008-10-02 12 views
9

Je suis en train de sérialiser un objet dans une application C# VS2003/.Net 1.1. J'en ai besoin sérialisé sans l'instruction de traitement, cependant. La classe XmlSerializer met quelque chose comme ceci:Omettre l'instruction de traitement XML lors de la sérialisation d'un objet

<?xml version="1.0" encoding="utf-16" ?> 
<MyObject> 
    <Property1>Data</Property1> 
    <Property2>More Data</Property2> 
</MyObject> 

Est-il possible d'obtenir quelque chose comme ce qui suit, sans traiter le texte résultant pour enlever l'étiquette?

<MyObject> 
    <Property1>Data</Property1> 
    <Property2>More Data</Property2> 
</MyObject> 

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

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 

using (TextWriter stringWriter = new StringWriter(builder)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 

Répondre

3

Le lien suivant vous amène à un article où quelqu'un a une méthode pour supprimer l'instruction de traitement en utilisant un XmlWriter et en entrant dans un état 'Element' plutôt que dans un état 'Start'. Cela provoque l'instruction de traitement à ne pas être écrite.

Suppress Processing Instruction

Si vous passez un XmlWriter au sérialiseur, il n'émet un traitement instruction si est « Start » (à savoir, n'a pas eu quelque chose écrit à encore) l'état du XmlWriter.

// Assume we have a type named 'MyType' and a variable of this type named 
'myObject' 
System.Text.StringBuilder output = new System.Text.StringBuilder(); 
System.IO.StringWriter internalWriter = new System.IO.StringWriter(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'auteur sera dans un état de « Element » (dans un élément) donc aucune instruction de traitement sera écrite. Une fois que vous avez fini d'écrire le XML , vous pouvez extraire le texte du flux sous-jacent et le traiter en le contenu de votre coeur.

+1

Mais cela nécessite encore de post-traitement le résultat de supprimer les balises de début et de fin de MyContainingElement, non? Bien qu'au moins ils seront connus, donc c'est bon ... –

+1

J'ai joué avec ceci et remplacé WriteStartElement avec WriteRaw ("") et ai éliminé le WriteEndElement - alors tout que j'ai dû faire pour obtenir la bonne sortie était TrimStart() la nomenclature est désactivée. Cool! –

7

En 2.0, vous pouvez utiliser XmLWriterSettings.OmitXmlDeclaration et sérialisation à un XmlWriter - mais je ne pense pas que cela existe en 1.1; donc pas entièrement utile - mais juste une autre chose "envisager de mise à niveau" ... et oui, je me rends compte que ce n'est pas toujours possible.

0

Si vous entendez par "instruction de traitement" la déclaration xml, vous pouvez éviter cela en définissant la propriété OmitXmlDeclaration de XmlWriterSettings. Vous devrez sérialiser en utilisant un XmlWriter, pour accomplir ceci.

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 

using (XmlWriter stringWriter = new StringWriter(builder, settings)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 

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

8

J'ai fait une petite correction

XmlSerializer serializer = new XmlSerializer(typeof(MyObject)); 
StringBuilder builder = new StringBuilder(); 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 
using (XmlWriter stringWriter = XmlWriter.Create(builder, settings)) 
{ 
    serializer.Serialize(stringWriter, comments); 
    return builder.ToString(); 
} 
+0

Merci d'avoir posté la correction: o) – Andrew

0

Cela fonctionne dans .NET 1.1. (Mais vous devriez toujours considérer la mise à jour)

XmlSerializer s1= new XmlSerializer(typeof(MyClass)); 
    XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
    ns.Add("", ""); 


    MyClass c= new MyClass(); 
    c.PropertyFromDerivedClass= "Hallo"; 

    sw = new System.IO.StringWriter(); 
    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() { } 
    } 
1

Qu'en est-il de l'omission des espaces de noms?

au lieu d'utiliser

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

ex:

<message xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"> 
+1

http://stackoverflow.com/questions/625927/omitting-namespace-when-serializing-an-object – NetSide