【发布时间】:2013-11-11 01:50:23
【问题描述】:
我正在使用 C#/.NET 反序列化一个类似于此的 XML 文件:
<?xml version="1.0" encoding="utf-8" ?>
<Books>
<Book
Title="Animal Farm"
>
<Thing1>""</Thing1>
<Thing2>""</Thing2>
<Thing3>""</Thing3>
...
<ThingN>""</ThingN>
</Book>
... More Book nodes ...
</Books>
我的类,对于反序列化的 XML,如下所示:
[XmlRoot("Books")]
public class BookList
{
// Other code removed for compactness.
[XmlElement("Book")]
public List<Book> Books { get; set; }
}
public class Book
{
// Other code removed for compactness.
[XmlAttribute("Title")]
public string Title { get; set; }
[XmlAnyElement()]
public List<XmlElement> ThingElements { get; set; }
public List<Thing> Things { get; set; }
}
public class Thing
{
public string Name { get; set; }
public string Value { get; set; }
}
反序列化时,我希望将 Book 元素的所有子节点(
有没有办法将异构子节点反序列化为一个集合(非 XmlElements)?
【问题讨论】:
-
您一直在说异构子节点,但您的示例中只有一种类型,即
Thing类型。还有更多吗?它们是从公共基类或接口继承的吗?它们是 Duck Typable 吗? -
意图是 Book 类的所有子节点都应该反序列化为 Thing 对象,而不考虑元素名称。因此,如果子节点是 Thing1、Thing2、Foo3 和 Bar4,则在反序列化时它们都是 Thing 对象。此外,每个子节点的 InnerText 将转到 Value 属性。
-
这是一种您无法控制的 XML 格式吗?否则,我建议您将它们简单地序列化为实际的 KeyValuePairs。即使是
List<KeyValuePair<Tkey, TValue>>似乎也是一个不错的选择。 -
如果我有一个 List
> 类型的属性,我会为该属性应用什么属性以进行反序列化?还是您建议我手动完成? -
你可以在下面看到我的解决方案。只要您可以控制格式,那么我认为它会满足您的需求。
标签: c# .net xml xmlserializer