0

我正在使用 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 事件?沿着这些路线还有其他东西吗?

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

4

2 回答 2

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 提供的事件是

UnknownAttribute, UnknownElement,UnknownNodeUnreferencedObject. 我想你必须创建你自己的XmlSerializer,顺便说一句,这不是什么工作。

于 2013-11-11T07:05:02.317 回答
1

@Ondrej-Janacek 的回答者是要走的路。只是为了满足您的好奇心,您可能会从 PublishDate 属性中删除 XmlAttribute 并添加另一个像这样

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

将使用在 XML 中找到的与任何成员不对应的所有属性调用此属性。在它的设置器中,您可以查找 PublishDate 值并将这些值分配给您的 PublishDate、Month 和 Year 属性。没有任何后盾领域

有关 XmlAnyAttribute 的更多信息,请参见此处

于 2013-11-11T07:40:48.300 回答