2011-08-09 13 views
7

W poniższym kodzie chcę ustawić "standalone = yes" na xml, jak mogę to zrobić?Ustawienie StandAlone = Tak w .Net podczas serializacji obiektu

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 

Na przykład, mam to:

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

Ale chcę to:

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

Odpowiedz

7

Jeśli chcesz to zrobić, to musisz użyć WriteProcessingInstruction metodę i ręcznie zapisz to.

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

Dziękuję, że nie jest jeszcze tak eleganckie, jak bym miał nadzieję, ale wciąż jest lepszy niż .replace („", ""). lol –

+2

Możesz użyć xmlriter.WriteStartDocument (true); –

+0

@HasaniBlackwell ugh, właśnie zauważyłem ten komentarz ....... to byłaby odpowiedź, której szukałem! –

10

Znalazłem wiele bardziej elegancki sposób to zrobić: wystarczy zadzwonić WriteStartDocument(true) na przykład XmlWriter - ten kod serializes data i wysyła wynikowy XML do konsoli.

Po pierwsze, jeśli używasz StringWriter trzeba go podkręcić trochę do zmuszenia UTF-8, ale keep this in mind:

Kiedy SZEREGOWANIE dokumentu XML na ciąg .NET, kodowanie musi ustawić na UTF-16. Ciągi są przechowywane wewnętrznie w UTF-16, więc jest to jedyne kodowanie, które ma sens. Jeśli chcesz przechowywać dane w innym kodowaniu, używaj zamiast tego tablicy bajtów.

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) naprawdę czuje się jak idiomatycznym sposobu określania standalone=true. Pozycja wyjściowa wygląda następująco:

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

Być może 'xw.WriteStartDocument (standalone: ​​= true)' byłoby dobrym wykorzystaniem nazwanych argumentów? – RubberDuck

Powiązane problemy