代码之家  ›  专栏  ›  技术社区  ›  jlp

如何使用多个嵌套项反序列化XML?

  •  6
  • jlp  · 技术社区  · 16 年前

    我提供了无法更改的XML,需要将其反序列化为自定义类:

    <Person>
       <Addresses>
           <MainAddress>
              <Country />
              <City />
           </MainAddress>
           <AdditionalAddress>
              <Country />
              <City />
           </AdditionalAddress>
           <AdditionalAddress>
              <Country />
              <City />
           </AdditionalAddress>
           ... other additional addresses
       </Addresses>
       ... other elements
    </Person>
    

    然后我反序列化:

    XmlSerializer serializer = new XmlSerializer(typeof(Person), namespace);
    Person person = serializer.Deserialize(stream) as Person;       
    

    反序列化器在简单元素被反序列化时工作良好。 当存在类似元素的地址时,我在其类上实现IXmlSerializable,如下所示: link text

    问题是reader.ReadElementContentAsString()不能与复杂元素一起使用。

    2 回复  |  直到 9 年前
        1
  •  4
  •   PanJanek    16 年前

    ADRESESS类应按以下方式声明:

    [XmlRoot("Adressess")]
    public class Adressess
    {
        [XmlElement(ElementName = "MainAddress")]
        public MainAddress Main { get; set; }
    
        [XmlElement(ElementName = "AdditionalAddress")]
        public List<AdditionalAddress> AdditionalAddresses { get; set; }
    }
    
    [XmlRoot("MainAddress")]
    public class MainAddress 
    {
        public string Country { get; set; }
        public string City { get; set; }
    }
    
    [XmlRoot("AdditionalAddress")]
    public class AdditionalAddress
    {
        public string Country { get; set; }
        public string City { get; set; }
    }
    
        2
  •  0
  •   shrutyzet    13 年前

    此外,如果根对象类型具有名称空间,则必须对嵌套类型使用相同的名称空间。

    [System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")]
    class Person {...}
    
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")]
    class MainAddress{...}
    
    推荐文章