c#使用XmlElement属性将2个不同的XML节点反序列化为一个类

时间:2016-11-14 16:11:48

标签: c# xml deserialization

在我的项目中,我必须将Xml文档反序列化为类。文档看起来像这样(基本结构):

<Document>
    <Ifno>Some info</Info>
    <Client>
        <CilientName>Name</ClientName>
        <ClientAddress>Address</ClientAddress>
    </Client>
    <Shipper>
        <ShipperName>Name</ShipperName>
        <ShipperAddress>Address</ShipperAddress>
    </Shipper>
</Document>

在我的代码中,我使用System.Xml.Serialization,因此可以轻松添加XmlRootXmlElement属性以帮助进行deserlialisation。但我对这个ClientInfoShipperInfo节点有疑问。我目前的代码如下所示:

public class Document
{
    [XmlElement("Ifno")]
    public string Information {get;set;}
    [XmlElement("Client")]
    public Client client {get;set;}
    [XmlElement("Shipper")]
    public Shipper shipper{get;set;}
}

public class Client
{
    [XmlElement("ClientName")]
    public string Name{get;set;}
    [XmlElement("ClientAddress")]
    public string Addres{get;set;}
}

public class Shipper
{
    [XmlElement("ShipperName")]
    public string Name{get;set;}
    [XmlElement("ShipperAddress")]
    public string Addres{get;set;}
}

此代码没问题,它对我来说很合适。但正如您所看到的,我们不需要课程ShipperClient我们可以将其替换为类Person(仅示例名称)因为我们使用相同的属性。所以代码看起来像:

public class Document
{
    [XmlElement("Ifno")]
    public string Information {get;set;}
    [XmlElement("Client")]
    public Person client {get;set;}
    [XmlElement("Shipper")]
    public Person shipper{get;set;}
}

public class Person
{
    [XmlElement( ? )]
    public string Name{get;set;}
    [XmlElement( ? )]
    public string Addres{get;set;}
}

但我不知道如何命名属性来使其工作?

有2个想法,但不知道这是否可以编码。

首先在Attribute中添加一些验证 [XmlElement( parentName="Client" ? "ClientName" : "ShipperName"]但我不知道如何检查父名称。 第二个想法也是父母的名字 [XmlElement(parentName + "Name")] 这应该是可能的,因为属性名称始终为parent + something,但我不能这样做。

我100%确定这有简单的解决方案,但我不知道是什么。有任何想法吗 ?

0 个答案:

没有答案