2017-08-08 9 views
0

Aidez-moi à créer un modèle pour la désérialisation de XML avec plusieurs tags avec le même nom mais un contenu différent.XML Désérialisation avec plusieurs éléments avec le même nom mais un contenu différent

<?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> 

Ce fichier XML contient 2 collection enveloppé dans la balise <objects>. À des fins de débogage, j'ai utilisé le même contenu pour les deux balises <objects>, mais en réalité, elles seront différentes. De plus le contenu de chacune de ces collections pourrait changer, mais la structure du document est la même: il contient une collection de préfixes, et 2 collections d'objets.

Voici les objets de données utilisés pour linéariser/désérialiser ce 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; } 
} 

Le problème est - que la sérialisation fonctionne très bien avec cette classe de modèle, mais quand désérialisation, propriété AnotherObjects est toujours nulle. Une autre chose étrange - est que la propriété Objects (dans la classe UserProfileDto) est remplie avec les données du dernier élément <object>.

S'il vous plaît aider à faire face à cette désérialisation.

+0

Si vous avez des éléments avec le même nom, mais différents objets derrière eux, vous pouvez utiliser vos propres méthodes sérialisation/deseralizaton. Utiliser XElement pourrait vous aider. – KamikyIT

+0

Le fichier XML que vous avez envoyé a le même contenu. Donc, votre question n'a pas de sens. Montrez le xml avec le contenu différent, alors nous parlerons. –

+0

Alexander, xml est corrige. J'ai besoin de désérialiser exactement ce xml. Ce document xml représente la liste des préfixes et 2 listes des mêmes objets. Le défi est que 2 étiquettes de ont des significations différentes, par ex. première étiquette représente la liste des utilisateurs réguliers, et deuxième - liste des gestionnaires de groupe – Valentine

Répondre

0

J'ai trouvé une solution de contournement pour ce problème. Avant la sérialisation, la transformation xslt est appliquée pour convertir le format xml au format souhaité, puis le fichier XML désérialisé en un objet.

Pour cet exemple, j'appliqué après transformation xslt:

<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>