2011-08-09 23 views
7

En el siguiente código quiero establecer "standalone = yes" en el xml, ¿cómo puedo hacer esto?Configuración StandAlone = Sí en .Net al serializar un objeto

Dim settings As New Xml.XmlWriterSettings 
settings.Encoding = encoding 

Using stream As New IO.MemoryStream, xtWriter As Xml.XmlWriter = _ 
    Xml.XmlWriter.Create(stream, settings) 
    serializer.Serialize(xtWriter, obj) 
    Return encoding.GetString(stream.ToArray()) 
End Using 

Por ejemplo, tengo esto:

<?xml version="1.0" encoding="utf-8"?> 

Pero quiero esto:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

Respuesta

7

Si usted quiere hacer esto, entonces usted tendrá que utilizar WriteProcessingInstruction método y manualmente escribirlo.

Using stream As New IO.MemoryStream, xtWriter As Xml.XmlWriter = Xml.XmlWriter.Create(stream, settings) 
     xtWriter.WriteProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""") 
     serializer.Serialize(xtWriter, obj) 
     Return encoding.GetString(stream.ToArray()) 
    End Using 
+0

Gracias, eso todavía no es tan elegante como yo habría esperado, pero sigue siendo mejor que .Colocar ("", ""). lol –

+2

Puede usar xmlriter.WriteStartDocument (true); –

+0

@HasaniBlackwell ugh, justo ahora noto ese comentario ... ¡esa hubiera sido la respuesta que estaba buscando! –

10

he encontrado una manera mucho más elegante de hacer esto: sólo tiene que llamar WriteStartDocument(true) en su XmlWriter ejemplo - el código serializa data y emite el XML resultante a la consola.

En primer lugar, si usted está usando un StringWriter necesita ajustar un poco para obligar a UTF-8, pero keep this in mind:

Cuando serialising un documento XML en una cadena NET, la codificación debe establecerse en UTF-16. Las cadenas se almacenan como UTF-16 internamente, por lo que esta es la única codificación que tiene sentido. Si desea almacenar datos en una codificación diferente, en su lugar utiliza una matriz de bytes.

public sealed class Utf8StringWriter : StringWriter 
{ 
    public override Encoding Encoding { get { return Encoding.UTF8; } } 
} 
using (var sw = new Utf8StringWriter()) 
using (var xw= XmlWriter.Create(sw, new XmlWriterSettings{Indent = true})) 
{ 
    xw.WriteStartDocument(true); // that bool parameter is called "standalone" 

    var namespaces = new XmlSerializerNamespaces(); 
    namespaces.Add(string.Empty, string.Empty); 

    var xmlSerializer = new XmlSerializer(typeof(data)); 
    xmlSerializer.Serialize(xw, data); 

    Console.WriteLine(sw.ToString()); 
} 

WriteStartDocument(true) realmente se siente como la forma idiomática de especificar standalone=true. El encabezado de salida es el siguiente:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
+2

Quizás 'xw.WriteStartDocument (standalone: ​​= true)' sería un buen uso de args con nombre? – RubberDuck

Cuestiones relacionadas