Настройка StandAlone = Да в .Net при сериализации объекта - PullRequest
8 голосов
/ 09 августа 2011

В следующем коде я хочу установить "standalone = yes" для xml, как я могу это сделать?

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

Например, у меня есть это:

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

Но я хочу это:

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

Ответы [ 2 ]

16 голосов
/ 27 ноября 2015

Я нашел гораздо более элегантный способ сделать это: просто вызовите WriteStartDocument(true) на вашем XmlWriter экземпляре - этот код сериализует data и выводит полученный XML на консоль.

Во-первых, если вы используете StringWriter, вам нужно немного его настроить, чтобы заставить UTF-8, но имейте это в виду :

При сериализации XML-документа в строку .NET кодировка должна быть установлена ​​в UTF-16. Строки хранятся как UTF-16 внутри, так что это единственная кодировка, которая имеет смысл. Если вы хотите хранить данные в другой кодировке, вместо этого вы используете байтовый массив.

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) действительно выглядит как идиоматический способ указания standalone=true. Выходной заголовок выглядит так:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
7 голосов
/ 09 августа 2011

Если вы хотите сделать это, вам нужно будет использовать метод WriteProcessingInstruction и выписать его вручную.

    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
...