如何在.NET中序列化XML时去除不必要的空格和换行符?

14

虽然有些老,但我认为区别在于您使用XmlWriter还是TextWriter。根据我的经验,XmlWriter默认情况下不进行格式化。这很有道理,因为它知道自己正在编写一个格式不重要的文档,而文本编写器则是编写纯文本。 - Timothy
3个回答

26

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

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);
    }
}

1
我必须像这样交换参数:_serializer.Serialize(writer, o);。非常好的解决方案,谢谢! - Dennis

3

有趣的是,我以为默认情况下没有格式。我刚试了以下内容,并没有任何格式:

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>

这样的不一致应该向微软报告。一个方法不能以不同的方式行为。这是与 CultureInfo 有关吗?还是与 .NET 版本/服务包有关?我还不知道。 - Jader Dias
如果你有机会的话,请运行我发布的代码。我正在运行.NET 3.5 SP1。让我们看看真正的区别是什么。 - John Saunders
你的代码在 .net 4.5 中没有空格。但我的另一个实现有空格,并将 StringWriter 实例传递到 Serialize 调用的第一个参数中。 - CRice

0
请同时检查序列化类是否包含 XML 类型的成员(例如 XmlElement)。我使用 Xsd2Code 工具从 XSD 生成类,并在非常特殊的情况下创建了一个 XmlElement 类型的成员。在序列化期间,该成员具有自己的格式(确切地说是缩进)。即使我已经打开(或关闭)了 XmlSerializer 缩进,它也不会对 XmlElement 成员产生影响。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接