2009-06-02 3 views
0

J'ai un xml comme leComment créer collection d'objets à partir d'un xml

suivant
<DataCollection> 
    <Data> 
    <Name>John</Name> 
    <Age>30</Age> 
    </Data> 
    ... more person 
</DataCollection> 

Je veux créer un objet (ou un certain type) collection avec le nom, l'âge comme des champs. Un de mes problèmes est que je ne connais pas la structure d'avant main (tout ce que je sais c'est, il y aura DataCollection et Data) pour créer une classe et ensuite utiliser linq pour utiliser select new. Mise en œuvre actuelle, je marche le XML pour chaque données, lire les éléments et créer une liste séparée par des virgules.

Y a-t-il une meilleure façon de procéder? Le but du XML est d'afficher toutes les données qui arrivent sous Données dans une grille de données.

+0

Les données peuvent être plus une colonne. Pour la simplicité, j'ai donné seulement 2 colonnes. – Nair

Répondre

3

FWIW est ici la requête LINQ qui va transformer ce document XML dans une collection d'objets:

var coll = from XElement c in doc.Descendants("Data") 
     select new { 
      Name = c.Element("Name").Value, 
      Age = int.Parse(c.Element("Age").Value) 
     }; 

Mais je pense que ce que vous cherchez vraiment est un moyen de lier le document XML un répertoire DataGrid tly. Une façon de faire est de lier votre DataGrid à un DataTable et d'utiliser ses méthodes WriteXml/ReadXml pour lire/écrire le fichier.

En aperçu ... J'ai manqué l'exigence que la structure du XML entrant est inconnue. Vous pouvez construire une collection de collections d'objets sans connaître la structure des blocs de données en utilisant cette LINQ:

var coll = from XElement c in loaded.Descendants("Data") 
     select (from XElement d in c.Elements() select d.Value); 

Ou vous pouvez générer le CSV avec ceci:

string csv = string.Join(Environment.NewLine, 
(from XElement c in loaded.Descendants("Data") 
    select string.Join(",", 
    (from XElement d in c.Elements() select d.Value).ToArray()) 
).ToArray()); 
1

J'espère avoir compris votre question ... de toute façon - En supposant que vous utilisez asp.net depuis que vous avez mentionné Linq, les dictionnaires sont votre meilleur choix.

vous pouvez trouver plus sur eux ici: http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

En général, le dictionnaire contient des paires clé/valeur afin que vous ne devez pas utiliser les virgules et être en mesure d'utiliser des boucles comme vous devriez.

Espérons que ça aide!

0

Si des données sont en lecture seule, avez-vous envisagé d'utiliser Xslt pour le formater dans une table HTML?

Voici un article j'ai trouvé sur stackoverflow qui couvre cette ...

Ensuite, il semble que les éléments enfants de pourrait changer tout ce qu'ils voulaient mais ils seraient encore rendent à votre grille (tableau html) .. .

Questions connexes