2011-06-09 21 views
15

estoy usando el siguiente código para crear un documento XML -quitar la codificación de XmlSerializer

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
ns.Add("", ""); 
new XmlSerializer(typeof(docket)).Serialize(Console.Out, i, ns); 

esto funciona muy bien en la creación del archivo XML con atributos ningún espacio de nombres. Me gustaría no tener ningún atributo de codificación en el elemento raíz, pero no puedo encontrar la forma de hacerlo. ¿Alguien tiene alguna idea de si esto se puede hacer?

Gracias

Respuesta

23

respuesta Antiguo eliminado y actualizar con la nueva solución:

Suponiendo que está bien para eliminar la declaración XML completamente, ya que hace no mucho sentido sin el atributo de codificación:

XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); ns.Add("", ""); 
using (XmlWriter writer = XmlWriter.Create(Console.Out, new XmlWriterSettings { OmitXmlDeclaration = true})) 
{ 
    new XmlSerializer(typeof (SomeType)).Serialize(writer, new SomeType(), ns); 
} 
+5

Esto es más de un comentario que una respuesta adecuada ... tratar de trabajar en su respuesta o puede que se downvoted para que –

+0

Estoy de acuerdo y han modificado en una mejor. ;-) – Achim

+0

Eso funciona perfectamente - Gracias. – czuroski

1
string withEncoding;  
using (System.IO.MemoryStream memory = new System.IO.MemoryStream()) { 
    using (System.IO.StreamWriter writer = new System.IO.StreamWriter(memory)) { 
     serializer.Serialize(writer, obj, null); 
     using (System.IO.StreamReader reader = new System.IO.StreamReader(memory)) { 
      memory.Position = 0; 
      withEncoding= reader.ReadToEnd(); 
     } 
    } 
} 

string withOutEncoding= withEncoding.Replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", ""); 
+1

usando una cadena. Reemplazar podría funcionar, pero me preguntaba si había una forma de hacerlo con el xmlserializer, como hice anteriormente para eliminar el espacio de nombres. – czuroski

+0

Estoy interesado en lo mismo. Alguien tiene una respuesta? Utilicé: StringBuilder.ToString(). Reemplazar ("<", "<") Reemplazar (">", ">"); porque tenía un código html que no quería codificar. –

6

Para eliminar codificación de XML pase cabecera TextWriter con nula codificación a XmlSerializer:

MemoryStream ms = new MemoryStream(); 
XmlTextWriter w = new XmlTextWriter(ms, null); 
s.Serialize(w, vs); 

Explicación

XmlTextWriter utiliza la codificación de TextWriter aprobada en constructor:

// XmlTextWriter constructor 
public XmlTextWriter(TextWriter w) : this() 
{ 
    this.textWriter = w; 
    this.encoding = w.Encoding; 
    .. 

Se utiliza esta codificación al generar XML:

// Snippet from XmlTextWriter.StartDocument 
if (this.encoding != null) 
{ 
    builder.Append(" encoding="); 
    ... 
+0

Curiosamente, la respuesta de Achim causó otros errores con mi serialización ... XmlTextWriter.Create() no se comporta igual que "new XmlTextWriter()" y me daba errores de referencia nulos. Esta técnica funcionó bien, así que ¡gracias! – CodeRedick

+0

Usar una 'codificación' que es' nulo' es una buena manera de lograr esto. Tenga en cuenta que de acuerdo con [la sección 2.8 de la Recomendación XML 1.1] (http://www.w3.org/TR/xml11/#sec-prolog-dtd) es perfectamente legal no incluir una declaración de codificación dentro de la declaración XML. En ese caso, la declaración XML se ve así: '' (O '' Para XML 1.0). –

1

crédito a este blog por ayudarme con mi código http://blog.dotnetclr.com/archive/2008/01/29/removing-declaration-and-namespaces-from-xml-serialization.aspx

aquí está mi solución, la misma idea, pero en VB.NET y un poco más claro en mi opinión.

Dim sw As StreamWriter = New, StreamWriter(req.GetRequestStream,System.Text.Encoding.ASCII) 
Dim xSerializer As XmlSerializer = New XmlSerializer(GetType(T)) 
Dim nmsp As XmlSerializerNamespaces = New XmlSerializerNamespaces() 
nmsp.Add("", "") 

Dim xWriterSettings As XmlWriterSettings = New XmlWriterSettings() 
xWriterSettings.OmitXmlDeclaration = True 

Dim xmlWriter As XmlWriter = xmlWriter.Create(sw, xWriterSettings) 
xSerializer.Serialize(xmlWriter, someObjectT, nmsp)