2008-10-02 11 views
9

Estoy serializando un objeto en una aplicación C# VS2003/.Net 1.1. Sin embargo, lo necesito serializado sin las instrucciones de procesamiento. La clase XmlSerializer pone algo como esto:Omitir instrucciones de procesamiento XML al serializar un objeto

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

¿Hay alguna manera de obtener algo como lo siguiente, sin procesar el texto resultante para eliminar la etiqueta?

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

Para aquellos que son curiosos, mi código es el siguiente ...

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

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

Respuesta

3

El siguiente enlace lo llevará a una publicación en la que alguien tiene un método para suprimir las instrucciones de procesamiento al usar un XmlWriter y pasar al estado 'Elemento' en lugar de al estado 'Comenzar'. Esto hace que las instrucciones de procesamiento no se escriban.

Suppress Processing Instruction

Si pasa una XmlWriter al serializador, sólo se emitirá una instrucción de procesamiento si el estado de la XmlWriter es 'Inicio' (es decir, no ha tenido nada escrito a ella todavía).

// 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(); 

En este caso, el escritor va a estar en un estado de 'elemento' (dentro de un elemento) así que no hay instrucción de procesamiento se escribirá. Una vez que termine de escribir el XML, puede extraer el texto de la secuencia subyacente y procesarlo al contenido de su corazón.

+1

Pero esto todavía requiere post-procesar el resultado de eliminar las etiquetas de inicio y fin MyContainingElement, ¿no? Aunque al menos se conocerán, así que es bueno ... –

+1

Jugué con esto y reemplacé WriteStartElement con WriteRaw ("") y me deshice del WriteEndElement; entonces todo lo que necesitaba hacer para obtener un buen resultado fue TrimStart() el BOM desactivado ¡Guay! –

7

En 2.0, se usaría XmLWriterSettings.OmitXmlDeclaration, y serializar a un XmlWriter - sin embargo yo no creo que esto existe en 1.1; entonces no completamente útil, pero solo una cosa más de "considerar la actualización" ... y sí, me doy cuenta de que no siempre es posible.

0

Si por "instrucción de procesamiento" se entiende la declaración xml, puede evitar esto configurando la propiedad OmitXmlDeclaration de XmlWriterSettings. Tendrá que serializar usando un XmlWriter, para lograr esto.

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(); 
} 

Pero ah, esto no responde a su pregunta para 1.1. Bueno, para referencia a otros.

8

me hizo una pequeña corrección

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

Gracias por publicar la corrección: o) – Andrew

0

Esto funciona en .NET 1.1. (Pero aún debe considerar la actualización)

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é tal omitir los espacios de nombres?

en lugar de utilizar

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

ejemplo:

<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

Cuestiones relacionadas