【问题标题】:How to serialize a XML without unnecessary spaces and line breaks? (.NET)如何在没有不必要的空格和换行符的情况下序列化 XML? (。网)
【发布时间】:2009-07-16 17:23:56
【问题描述】:

我正在使用XmlSerializer.Serialize,它会产生换行符和不必要的空格。如何避免?

【问题讨论】:

  • 旧,但我相信区别在于您使用的是 XmlWriter 还是 TextWriter。以我的经验,XmlWriter 默认为无格式。这是有道理的,因为它知道它正在编写格式无关紧要的文档,而文本编写器正在编写纯文本。

标签: .net xml xml-serialization


【解决方案1】:

也许您可以使用接受XmlWriter 的重载,并使用XmlWriterSettings 实例配置给定的XmlWriter

XmlWriterSettings 允许您控制换行和缩进的应用。

void Serialize(Object o)
{
    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = false;
    settings.NewLineHandling = NewLineHandling.None;
    //settings.OtherProperties = values;

    using (XmlWriter writer = XmlWriter.Create(CreateStream(), settings))
    {
        _serializer.Serialize(writer, o);
    }
}

【讨论】:

  • 我不得不像这样切换参数:_serializer.Serialize(writer, o);。很好的解决方案,谢谢!
【解决方案2】:

有趣的是,我以为默认没有格式化。我刚刚尝试了以下并没有格式化:

using (var stream = new MemoryStream())
{
    System.Text.Encoding encoding;
    using (var writer = XmlWriter.Create(stream))
    {
        if (writer == null)
        {
            throw new InvalidOperationException("writer is null");
        }

        encoding = writer.Settings.Encoding;
        var ser = new XmlSerializer(obj.GetType());
        ser.Serialize(writer, obj);
    }

    stream.Position = 0;
    using (var reader = new StreamReader(stream, encoding, true))
    {
        return reader.ReadToEnd();
    }
}

在示例运行中,它返回了以下 XML:

<?xml version="1.0" encoding="utf-8"?><obj xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><childOne /><childTwo /><text>text1</text><text>text2</text></obj>

【讨论】:

  • 此类不一致应报告给 Microsoft。一个方法不能以不同的方式表现。它依赖于 CultureInfo?或者它是一个 .NET 版本/服务包?我还不知道。
  • 如果有机会,请运行我发布的代码。我正在运行 .NET 3.5 SP1。让我们看看真正的区别是什么。
  • 您的代码在 .net 4.5 中没有空格。但是我的另一个实现确实做到了,那就是将 StringWriter 实例传递给 Serialize 调用的第一个参数。
【解决方案3】:

还请检查序列化的类是否包含 XML 类型的成员(如 XmlElement)。我使用 Xsd2Code 工具从 XSD 生成类,并且(在非常特殊的情况下)它创建了 XmlElement 类型的成员。在序列化过程中,该成员有自己的格式(准确的标识)。即使我打开(或关闭)XmlSerializer 缩进,它对 XmlElement 成员也没有影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多