Omitir instrucciones de procesamiento XML al serializar un objeto
-
03-07-2019 - |
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();
}
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() { }
}