【问题标题】:XML Deserialize duplicate nodes to an objectXML 将重复节点反序列化为对象
【发布时间】:2012-09-26 23:09:48
【问题描述】:

我有一个带有重复节点的以下 xml(“地址”),我需要将这些“地址”节点反序列化为一个对象:

<dealer id="8569" ed="0">
  <name hide="0">some name</name>
  <url>http://www.some.com</url>
  <address hide="0" />
  <address>
    <line1>text1</line1>
    <line2>text2</line2>
    <line3>text3</line3>
    <town>Town</town>
    <postcode>Postcode</postcode>
  </address>
</dealer>

我需要将其反序列化为以下类:

public class Dealer
{
    public Dealer()
    {
        _address = new Address();
    }

    [XmlAttribute("id")]
    public long Id { get; set; }

    [XmlElement("name")]
    public string Name{ get; set; }

    [XmlElement("url")]
    public string Url{ get; set; }

    [XmlElement("address")]
    public Address Address{ get; set; }

}    
public class Address
{
    [XmlElement("line1")]
    public string Line1{ get; set; }

    [XmlElement("line2")]
    public string Line2 { get; set; }

    [XmlElement("line3")]
    public string Line3 { get; set; }

    [XmlElement("county")]
    public string County{ get; set; }

    [XmlElement("town")]
    public string Town{ get; set; }

    [XmlElement("postcode")]
    public string Postcode{ get; set; }
}

当这个 xml 被反序列化到上面的类时,它总是得到第一个“地址”节点,但是,我需要第二个节点被拾取。我该怎么做?

【问题讨论】:

  • 第二次读取时,您是否需要合并地址数据?即 Line1, Line2, Line3, County, Town, Postcode AND "hide=0" 值?或者你可以完全忽略第一个地址元素节点?
  • 为什么不使用地址列表,只是好奇?
  • @ChrisSinclair 是的,我想合并地址数据?
  • 你只需要一个地址做什么?在 UI 上显示?
  • @Miro,那么您打算在Address 上添加一个Hide 属性并在您的程序中使用它?

标签: c# c#-4.0


【解决方案1】:

除了更改您的 XML 架构之外,我所能想到的只是让您的 Dealer 类实现 IXmlSerializable 并实现关联的 ReadXml 方法以使用所需的 xml 节点。 http://msdn.microsoft.com/en-us/library/system.xml.serialization.ixmlserializable.readxml.aspx

除此之外,您可以将 Dealer.Address 更改为与 两种 表示兼容的 Address 对象的集合/数组,然后在反序列化后忽略/从集合中删除空地址.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多