2009-12-10 23 views
5

ich XML gegeben habe, dass ich nicht und ich brauche es deserialisieren zu einer benutzerdefinierten Klasse ändern können:Wie XML mit mehreren verschachtelten Elementen deserialisieren?

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

Dann deserialisieren I: sind deserialisiert

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

Deserializer funktioniert bei einfachen Elementen . Wenn es Elemente wie Adressen I IXmlSerializable wie hier auf seiner Klasse implementieren: link text

Das Problem ist, dass reader.ReadElementContentAsString() kann nicht mit komplexen Elementen verwendet werden.

Antwort

3

Adressess Klasse sollte auf diese Weise erklärt werden:

[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; } 
} 
+0

anzumerken, dass die Typnamen nicht relevant ist, so z.B. Die MainAddress-Eigenschaft könnte in einer Klasse MainAddressStore oder was auch immer implementiert werden (ich finde es manchmal verwirrend, dass Eigenschaften und Typen Namen teilen). Das ist für Skelettklassen wie dieses, deren einziger Zweck die Serialisierungsunterstützung ist, natürlich nicht sehr wichtig. –

+0

Ich habe gerade die Eigenschaftsnamen so geändert, dass sie sich von den Klassennamen unterscheiden. Ich bin nur nicht sicher, ob die verschiedenen Klassen MainAddress und AdditionalAddress wirklich benötigt werden. Ich wollte, dass sie mit einem anderen XmlRoot-Namen angekündigt wurden. – PanJanek

+0

Ich arbeite nicht. MainAddress ist ausgefüllt, AdditionalAddresses nicht. – jlp

0

Auch wenn der Wurzel-Objekttyp einen Namensraum hat, müssen Sie den gleichen Namensraum für die verschachtelten Typen verwenden.

Beispiel:

[System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")] 
class Person {...} 

[System.Xml.Serialization.XmlRootAttribute(Namespace = "some namespace")] 
class MainAddress{...} 
Verwandte Themen