将具有不同模式的XML反序列化为共享类型

时间:2011-02-28 23:07:04

标签: c# xml xml-serialization

使用c#,我想将各种来源的xml反序列化为常见类型的对象。 XML将不具有相同的架构。例如,在以下xml中,/thingContainer/thing/namewidget/@title都会映射到myClass.DisplayName

XML1:

<thingContainer>
    <thing>
        <name>MyName</name>
    </thing>
</thingContainer>

XML2:

<widget title="myTitle" />

所以,我不能用[XmlElement]来标记我的课程,因为根据我的xml的来源,它会有所不同。是否有一些技巧可以用继承或一些助手类来使我能够轻松地从不同的源反序列化xml?是否有一些简单的方法将类字段映射到xpaths?

当然,如果必须的话,我会解析并手动反序列化xml ......但那有什么乐趣?

2 个答案:

答案 0 :(得分:1)

立即浮现在脑海中的两个想法:

  • 使用XSLT将原始XML转换为与您的对象模型匹配的临时格式(一种非常流行的方法,但我个人鄙视XSL)
  • 创建临时对象模型以反序列化,然后将它们映射到最终对象模型。

可能有一些XmlElement hackery可能,但似乎这将是一个混乱的方法。

答案 1 :(得分:0)

我认为你有两种选择:

  1. 为您的班级实施IXmlSerializable,并在考虑XML结构的情况下反序列化
  2. 只需使用LINQ to XML来解析XML并创建类的实例。这是我选择的方法(我自己已经完成了第一选择而不喜欢它)