如何使用XmlSerializer解析反序列化属性(在反序列化期间)?

时间:2013-11-11 06:34:32

标签: c# .net xmlserializer xml-deserialization

我正在使用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事件?还有其他的东西吗?

请注意,我意识到无支持字段要求是任意的;我很想知道是否有其他选择。

2 个答案:

答案 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提供的事件为

UnknownAttributeUnknownElementUnknownNodeUnreferencedObject。我想你必须创建自己的XmlSerializer,顺便说一下,这不是一件好事。

答案 1 :(得分:1)

@ Ondrej-Janacek的anwser是要走的路。为了满足您的好奇心,您可以从PublishDate属性中删除XmlAttribute,并添加另一个,如此

[XmlAnyAttribute]
public XmlAttribute[]XAttributes {get; set;}

将使用XML中找到的与任何成员不对应的所有属性调用此属性。在它的setter中,您可以查找PublishDate值并将值分配给PublishDate,Month和Year属性。 没有任何支持领域

有关XmlAnyAttribute的更多信息,请参阅here