2016-09-07 1 views
1

J'ai certaines données que je dois apporter d'un fichier XML à une base de données PostgreSQL via une application C# sur laquelle je travaille actuellement.Format XML contenant la liste pour la désérialisation

Le problème que je rencontre maintenant est que j'ai besoin d'ajouter une sorte de liste au XML maintenant. Actuellement, il ressemble à ceci:

<itemOne>stuff</itemOne> 
<itemTwo>otherStuff</itemTwo> 
<listOfItems> 
    <listItem> 
     <partOne>123</partOne> 
     <partTwo>abc</partTwo> 
    </listItem> 
    <listItem> 
     <partOne>123</partOne> 
     <partTwo>abc</partTwo> 
    </listItem> 
</listOfItems> 

Je trouve tout à fait des discussions qui traitent le sujet de la façon dont désérialiser listes. Mais tous commencent par dire que le XML proposé devrait être modifié. Comme j'ai toute la liberté que je peux souhaiter à cet égard, je voudrais d'abord créer un format XML optimal au début.

Eh bien, et désérialiser ensuite. Donc, s'il y a un format pour les listes qui est automatiquement traité par XmlSerializer.Deserialize() ce serait incroyable.

+1

Et est la question? –

+0

Est-ce que ce format XML (en particulier la liste) est bon pour la désérialisation avec XmlSerializer? –

+0

Essayez-le et voir. –

Répondre

1

Ces données seront déjà traitées automatiquement par XmlSerializer, à condition que la classe soit adaptée. Par exemple:

[XmlRoot("yourRootName")] 
public class Foo { 
    [XmlElement("itemOne")] public string A {get;set;} 
    [XmlElement("itemTwo")] public string B {get;set;} 

    [XmlArray("listOfItems")] 
    [XmlArrayItem("listItem")] 
    public List<Bar> Bars {get;set;} 
} 
public class Bar { 
    [XmlElement("partOne")] public int C {get;set;} 
    [XmlElement("partTwo")] public string D {get;set;} 
} 

Bien sûr, si elle était moi, je serais tenté d'être laconique, avec:

<betterName foo="stuff" blab="otherStuff"> 
    <nameMe a="123" b="abc"/> 
    <nameMe a="456" b="def"/> 
</betterName> 

qui nécessite que quelques changements minimes:

[XmlRoot("betterName")] 
public class Foo { 
    [XmlAttribute("foo")] public string A {get;set;} 
    [XmlAttribute("bar")] public string B {get;set;} 

    [XmlElement("nameMe")] 
    public List<Bar> Bars {get;set;} 
} 
public class Bar { 
    [XmlAttribute("a")] public int C {get;set;} 
    [XmlAttribute("b")] public string D {get;set;} 
} 
+0

Merci beaucoup, cela fonctionne comme un charme! J'ai trouvé les erreurs que j'avais dans les différences de ma version à votre première version et j'essaierai d'opter pour la deuxième version plus propre/plus courte de la vôtre quand je comprendrai tout. –