【问题标题】:Can .NET XmlSerializer class deserialize InnerXml as a string?.NET XmlSerializer 类可以将 InnerXml 反序列化为字符串吗?
【发布时间】:2009-07-22 15:07:30
【问题描述】:

我有一个非常具体的反序列化需求,请参见下面的示例:

假设我有以下课程:

[Serializable]
public class Person {
public string Name { get; set; }
public string PersonXml { get; set; }
}

并遵循 XML

约翰姓名> 文本人>

我想要的是 XmlSerializer 类将 元素的 InnerXml 反序列化为 PersonXml 属性作为字符串。 我想知道是否可以做到。

注意: 我知道我可以对 的内容进行编码以转义非法 XML 字符,但我更愿意让内部 XML 更加人性化(不包含 < 和其他只会让我的最终用户感到困惑的实体)

【问题讨论】:

    标签: .net xml serialization


    【解决方案1】:

    您始终可以实现IXmlSerializable 并通过XmlReader 做任何您想做的事情。

    【讨论】:

    • 对,我没有考虑这样的路径。这肯定会解决我的问题,虽然我希望有一些更便宜的解决方案 :) 谢谢!
    • 顺便说一句,XML 序列化不需要 [Serializable]。 [XmlElemenht("Name")] 也可以省略,因为在这种特殊情况下它不会改变 XMLSerializer 的默认行为。
    【解决方案2】:

    那么,即使元素实际上包含 XML 元素,您是否希望 .NET 假装它真的是一个字符串?我认为通过标准序列化是不可能的。

    但是,您可以加载 XML、转换 PersonXml 并正确转义它,然后用新转义的数据替换 PersonXml 的内容。这将涉及在反序列化之前手动操作 XML,但是您可以将 XML 元素保留在 PersonXml 下。

    【讨论】:

    • 是的,但在我看来,这太麻烦了,而且解决方案很丑:)
    【解决方案3】:

    我在寻找类似解决方案时遇到了这个答案。不想使用 IXmlSerializable。

    因此,如果将来有人在查看此问题以供参考,您可以使用XmlAnyElement 属性将内部 xml 序列化为 XmlNode。然后,您可以根据需要对 XmlNode 进行后期处理、单独运行序列化或仅根据需要获取 xml 文本。

    对于这个例子:

    public class Person 
    {
    
      public string Name { get; set; }
    
      [XmlAnyElement]
      public XmlNode PersonXml { get; set; }
    
    }
    

    【讨论】:

    • 还值得将 [XmlText] 属性添加到 PersonXml。这将包括作为节点子节点的文本节点
    • 这是一个巧妙的技巧。解决了我无法序列化作为接口的属性的问题。
      [XmlIgnore] IMyInterface Thing {get;set;} &lt;br/&gt; [XmlAnyElement("Thing")] public XmlNode ThingSerializer { get; set; } // put code in here to translate the object under your interface to/from XmlNode
    【解决方案4】:

    为什么不用 XML 来表示 XML?只需将XmlElement 用于PersonXml

    假装 XML 与 String 是一样的总是一个坏主意。

    【讨论】:

      【解决方案5】:

      帖子很旧,但我正在寻找解决方案,也许我的回答可以帮助某人。

      怎么样

      [XmlText]
      public string PersonXml { get; set; }
      

      这不会解决您的问题,但也许它可能是一个可以接受的替代方案。

      在我的例子中,PersonXml 是一个“不错的元素”,它并不总是包含 Xml。当 PersonXml 包含 Xml 时,[XmlText] 导致 PersonXml 为空。但是,当 PersonXml 包含没有 Xml 的文本时,反序列化是正确的。

      在我没有 [XmlText] 的情况下,PersonXml 中的 Xml 会导致 PersonXml 之前的元素被正确反序列化,但 PersonXml 之后的元素被错误地反序列化。

      【讨论】:

        猜你喜欢
        • 2010-09-23
        • 2011-05-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多