在序列化对象时,在.Net中设置StandAlone = Yes

Mr *_*ubs 8 .net serialization xml-serialization

在下面的代码中我想为xml设置"standalone = yes",我该怎么做?

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
Run Code Online (Sandbox Code Playgroud)

例如,我有这个:

<?xml version="1.0" encoding="utf-8"?>
Run Code Online (Sandbox Code Playgroud)

但我想要这个:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)

Mat*_*don 16

我发现了一种更优雅的方法:只需调用WriteStartDocument(true)您的XmlWriter实例 - 此代码序列化data并将生成的XML输出到控制台.

首先,如果你正在使用a,StringWriter你需要稍微调整它以强制使用UTF-8,但要记住这一点:

将XML文档序列化为.NET字符串时,编码必须设置为UTF-16.字符串在内部存储为UTF-16,因此这是唯一有意义的编码.如果要以不同的编码存储数据,则使用字节数组.

public sealed class Utf8StringWriter : StringWriter
{
    public override Encoding Encoding { get { return Encoding.UTF8; } }
}
Run Code Online (Sandbox Code Playgroud)
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());
}
Run Code Online (Sandbox Code Playgroud)

WriteStartDocument(true)真的感觉像是指定的惯用方式standalone=true.输出标题如下所示:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
Run Code Online (Sandbox Code Playgroud)

  • 在此代码示例中,看起来像“命名空间”变量作为 Serialize 函数的第三个参数被遗漏了?我认为如果您希望删除名称空间,则 xmlSerializer.Serialize(xw, data) 应该更改为 xmlSerializer.Serialize(xw, data, namespaces) 。谢谢。 (4认同)
  • 也许`xw.WriteStartDocument(standalone:= true)`可以很好地使用命名args? (2认同)

Chr*_*aas 7

如果你想这样做,那么你需要使用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
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用xmlriter.WriteStartDocument(true); (3认同)