2017-08-08 4 views
0

Bitte helfen Sie mir, ein Modell für die Deserialisierung von XML mit mehreren Tags mit demselben Namen, aber unterschiedlichen Inhalten zu erstellen.XML-Deserialisierung mit mehreren Elementen mit demselben Namen, aber anderem Inhalt

<?xml version="1.0" encoding="utf-16"?> 
<found> 
<prefixes> 
    <prefix name="Name1">Val1</prefix> 
    <prefix name="Name2">Val2</prefix> 
</prefixes> 
<objects> 
    <object handle="0"> 
     <User> 
      <familyName>Family</familyName> 
      <givenName>Given1</givenName> 
     </User> 
    </object> 
    <object handle="0"> 
     <User> 
      <familyName>Family2</familyName> 
      <givenName>Given2</givenName> 
     </User> 
    </object> 
</objects> 
<objects> 
    <object handle="0"> 
     <User> 
      <familyName>Family3</familyName> 
      <givenName>Given3</givenName> 
     </User> 
    </object> 
    <object handle="0"> 
     <User> 
      <familyName>Family4</familyName> 
      <givenName>Given4</givenName> 
     </User> 
    </object> 
</objects> 

Diese XML enthält 2 Sammlung <objects> in Tag enthalten. Für Debug-Zwecke habe ich den gleichen Inhalt für beide <objects> Tags verwendet, aber in Wirklichkeit werden sie unterschiedlich sein. Darüber hinaus könnte sich der Inhalt jeder dieser Sammlungen ändern, aber die Struktur des Dokuments ist dieselbe: Sie enthält eine Sammlung von Präfixen und 2 Sammlungen von Objekten.

Hier sind Objekte Daten verwendet zur Serialisierung/Deserialisierung dieses xml:

[XmlRoot(ElementName = "found", IsNullable = true)] 
public class UserProfileDto 
{ 
    [XmlArray("prefixes", Order = 0)] 
    [XmlArrayItem("prefix", IsNullable = false)] 
    public PrefixDto [] Prefixes { get; set; } 

    [XmlArray("objects", Order = 1)] 
    [XmlArrayItem(ElementName = "object", Type = typeof(ObjectDto), IsNullable = false)] 
    public ObjectDto[] Objects { get; set; } 

    [XmlArray("objects", Order = 2)] 
    [XmlArrayItem(ElementName = "object", Type = typeof(ObjectDto), IsNullable = false)] 
    public ObjectDto[] AnotherObjects { get; set; } 
} 

public class PrefixDto 
{ 
    [XmlAttribute("name")] 
    public string Name { get; set; } 

    [XmlText] 
    public string Value { get; set; } 
} 

public class ObjectDto 
{ 
    [XmlElement("User")] 
    public UserDto User { get; set; } 
} 

[Serializable] 
public class UserDto 
{ 
    [XmlElement("familyName")] 
    public string FamilyName { get; set; } 

    [XmlElement("givenName")] 
    public string GivenName { get; set; } 
} 

Das Problem ist, - dass die Serialisierung arbeitet mit dieser Modellklasse in Ordnung, aber wenn Deserialisieren Eigenschaft AnotherObjects ist immer null. Eine weitere seltsame Sache - ist, dass die Eigenschaft Objects (in der Klasse UserProfileDto) mit Daten aus dem letzten Element <object> gefüllt ist.

Bitte helfen Sie mit dieser Deserialisierung umzugehen.

+0

Wenn Sie Elemente mit dem gleichen Namen, aber unterschiedliche Objekte hinter ihnen, können Sie Ihre eigene Serialisierung/deseralizaton Methoden nutzen könnten. Die Verwendung von XElement könnte Ihnen helfen. – KamikyIT

+0

Die XML-Datei, die Sie eingereicht haben, hat den gleichen Inhalt. Deine Frage ergibt also keinen Sinn. Zeige XML mit anderem Inhalt, dann reden wir. –

+0

Alexander, Xml ist korrigiert. Ich muss genau dieses XML deserialisieren. Dieses XML-Dokument stellt eine Liste von Präfixen und 2 Listen derselben Objekte dar. Die Herausforderung besteht darin, dass 2 Tags von verschiedene Bedeutungen haben, z. Das erste Tag repräsentiert die Liste der regulären Benutzer und die zweite eine Liste der Gruppenmanager – Valentine

Antwort

0

Ich habe einen Workaround für dieses Problem gefunden. Vor der Serialisierung wird xslt-Transformation angewendet, um XML in das gewünschte Format zu konvertieren, und dann wird die resultierende XML in ein Objekt deserialisiert.

Für dieses Beispiel angewendet ich folgende XSLT-Transformation:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:template match="/found"> 
    <found> 
    <xsl:apply-templates select="prefixes"/> 
    <xsl:apply-templates select="objects[position()=1]"/> 
    <xsl:apply-templates select="objects[position()=2]"/> 
    </found> 
</xsl:template> 

<xsl:template match="prefixes"> 
    <prefixes> 
    <xsl:copy-of select="*" /> 
    </prefixes> 
</xsl:template> 

<xsl:template match="objects[position()=1]"> 
    <hitObjects> 
    <xsl:copy-of select="*" /> 
    </hitObjects> 
</xsl:template> 

<xsl:template match="objects[position()=2]"> 
    <ancillaryObjects> 
    <xsl:copy-of select="*" /> 
    </ancillaryObjects> 
</xsl:template> 

</xsl:stylesheet> 
Verwandte Themen