【问题标题】:Xml Serialization: Is there a way to control xml declaration using attribute(s)Xml 序列化:有没有办法使用属性来控制 xml 声明
【发布时间】:2014-01-15 14:46:28
【问题描述】:

有没有办法在使用类中的属性序列化对象时控制/调整 xml 声明。

换句话说,我正在 C# 中搜索可用于装饰我的类的属性,并有助于在序列化该类的对象时调整 xml 声明部分(其中的属性)。我知道有一个类 XmlDeclaration 可以用来实现它,但是我想使用属性来实现相同的结果,我认为这更干净,因为不同的处理指令保留在 POCO 类中,并且可以在不同的 POCO 类中变化。

如果有任何开箱即用的功能/自定义解决方案,请告诉我,或者这只是另一个愚蠢的问题...... :)

【问题讨论】:

  • 您能否详细说明“xml 声明”的含义?我假设 "(attributes in it)" 您指的是自定义写入 XML 本身的属性?
  • “xml 声明”是指任何 xml 文档中通常的第一行(如果没有省略),如下所示:。我所说的属性是指 xml 声明中的属性,而不是属于 xml 元素一部分的属性。

标签: c# xml serialization declaration


【解决方案1】:

正如您的评论所指出的,您正在谈论 XML 声明

<?xml …>

可以启动 XML 文档。

直接的答案似乎是否定的:在 System.Xml.Serialization 命名空间中没有 XmlDocumentAttribute 或类似名称。

但是,没有必要让 XML 序列化引擎将直接写入文件。而是写信给XmlWriter,您已正确配置为编写所需的 XML 声明(包括无声明)。然后将该 writer 传递到右侧 Serialize 方法重载。

请参阅this answer 以覆盖 XML 声明中的默认编码。

(虽然这不能回答您的问题——如何使用 POCO 类型中的属性来做到这一点——但有人可能会争辩说,XML 声明完全是关于如何正确编码文件中的 XML,以便正确地属于文件写入/读取代码,而不是序列化代码。)

【讨论】:

    【解决方案2】:

    您需要覆盖默认的XmlWriterSettings 并将OmitXmlDeclaration 属性设置为true,例如

    XmlWriterSettings writerSettings = new XmlWriterSettings
    {
        OmitXmlDeclaration = true
    };
    using (StringWriter strWriter = new StringWriter())
    using (XmlWriter xmlWriter = XmlWriter.Create(stringWriter, writerSettings))
    {
        XmlSerializer serializer = new XmlSerializer(typeof(myObject));
        serializer.Serialize(xmlWriter, myObject);
    }
    

    原来StringWriter 默认为 UTF-16,如果您需要控制编码,则需要派生自己的 StringWriter,已经有一个 good example 说明如何做到这一点。

    【讨论】:

    • 实际上,使用StringWriter 是一个不好的例子。我很确定你总是会从StringWriter 获得 UTF-16。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2010-12-28
    • 2023-04-07
    • 1970-01-01
    • 2015-04-25
    • 2012-04-08
    相关资源
    最近更新 更多