我正在使用C#/ .NET反序列化类似于此的XML文件:
<?xml version="1.0" encoding="utf-8" ?>
<Books>
<Book
Title="Animal Farm"
PublishedDate="08/17/1945"
/>
... 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; }
[XmlAttribute("PublishedDate")]
public string PublishedDate { get; set; }
public string Month { get; set; }
public string Year { get; set; }
}
反序列化时,我想将Book的PublishedDate属性值存储在Book对象的PublishedDate属性中。但是,我还想解析PublishedDate并将其Month和Year分配给这些属性。
有没有办法解析PublishedDate属性,并填充Month和Year属性,同时发生反序列化(没有使用支持字段)?例如,是否有一个接口提供了一个后处理反序列化节点的方法?每次反序列化已知对象时是否会触发XmlSerializer事件?还有其他的东西吗?
请注意,我意识到无支持字段要求是任意的;我很想知道是否有其他选择。
答案 0 :(得分:1)
嗯,一个解决方法是
public string Month
{
get
{
return DateTime.Parse(PublishedDate).Month;
}
set
{
PublishedDate = ... // this would be a little more code, but you can also do it
}
}
Year
非常相似。
对于该事件,仅XmlSerializer
class提供的事件为
UnknownAttribute
,UnknownElement
,UnknownNode
和UnreferencedObject
。我想你必须创建自己的XmlSerializer
,顺便说一下,这不是一件好事。
答案 1 :(得分:1)
@ Ondrej-Janacek的anwser是要走的路。为了满足您的好奇心,您可以从PublishDate属性中删除XmlAttribute,并添加另一个,如此
[XmlAnyAttribute]
public XmlAttribute[]XAttributes {get; set;}
将使用XML中找到的与任何成员不对应的所有属性调用此属性。在它的setter中,您可以查找PublishDate值并将值分配给PublishDate,Month和Year属性。 没有任何支持领域。
有关XmlAnyAttribute的更多信息,请参阅here。