Pregunta

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 presenta algo como esto:

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

¿Hay alguna forma 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 tienen curiosidad, mi código se ve así ...

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

using ( TextWriter stringWriter = new StringWriter(builder) )
{
    serializer.Serialize(stringWriter, comments);
    return builder.ToString();
}
¿Fue útil?

Solución

El siguiente enlace lo llevará a una publicación en la que alguien tiene un método para suprimir la instrucción de procesamiento mediante el uso de un XmlWriter y entrar en un estado 'Elemento' en lugar de un estado 'Inicio'. Esto hace que la instrucción de procesamiento no se escriba.

Suprimir Instrucción de procesamiento

  

Si pasa un XmlWriter al serializador, solo emitirá un procesamiento   instrucción si el estado de XmlWriter es 'Inicio' (es decir, no ha tenido nada   escrito aún).

// 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 estará en un estado de 'Elemento' (dentro de un elemento)   así que no se escribirá ninguna instrucción de procesamiento. Uno terminas de escribir el   XML, puede extraer el texto de la secuencia subyacente y procesarlo para   el contenido de tu corazón.

Otros consejos

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

En 2.0, usaría XmLWriterSettings.OmitXmlDeclaration y serializar en un XmlWriter; sin embargo, no creo que esto exista en 1.1; así que no es completamente útil, pero solo uno más "considere actualizar" cosa ... y sí, me doy cuenta de que no siempre es posible.

¿Qué pasa con la omisión de espacios de nombres?

en lugar de usar

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\">

Si por " instrucciones de procesamiento " te refieres a la declaración xml, entonces puedes 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.

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() { }
   }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top