2011-04-27 4 views
0

je cherchais à convertir un fichier xml que je devais me retourner une liste des types anonymes, donc j'ai somethings comme ceci:Convertir balise xml type anonyme

<Input name="MyProperty" datatype="string">a</Input> 
<Input name="SecondProperty" datatype="IPAddress">b</Input> 
<Input name="ThirdProperty" datatype="int">c</Input> 

et je voulais qu'il soit converti en le format ci-dessous:

select new 
     { 
     MyProperty=a, 
     SecondProperty=b, 
     ThridProperty=c, 
     } 

Serait-il possible de le faire L'idée est de renvoyer une liste de ces entrées pour alimenter une autre
quoi que ce soit method.Also mal faire les choses de cette façon?

grâce toute aide est appréciée

Répondre

0

Si vous connaissez à l'avance le nom des propriétés, vous pouvez le faire:

XElement doc = ... 
var obj = new 
{ 
    MyProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "MyProperty").Value, 
    SecondProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "SecondProperty").Value, 
    ThirdProperty = doc.Root.Elements("Input").First(e => e.Attribute("name") == "ThirdProperty").Value 
} 

Si vous ne connaissez pas les noms, vous pouvez » t utilisez un type anonyme. Les types anonymes sont vraiment des types normaux sans nom, leurs membres sont déclarés statiquement.

+0

J'espérais générer le nom du type anonyme à partir du nom d'attribut xml pour l'étiquette de nom ... cela peut-il fonctionner? – TommyTwist

+0

Non, car le contenu du fichier XML ne sera pas connu avant l'exécution. Les membres de types anonymes doivent être connus au moment de la compilation ... De toute façon, comment utiliseriez-vous les propriétés du type anonyme si vous ne connaissez pas leurs noms à l'avance? Un dictionnaire serait probablement plus adapté à vos besoins –

+0

merci Thomas pour votre contribution ... mais le problème est que je veux charger une collection de ces entrées au moment de l'exécution et ils varient d'entrée en entrée.J'espérais qu'il y avait un façon de renvoyer une liste de types anonymes basés sur la balise d'entrée parent. – TommyTwist

0

peut ne pas être la solution que vous cherchez, mais je voulais juste à travers elle là ...

Quelque chose que j'ai trouvé utile face à XML est la décoration d'une classe avec l'attribut Serializable ... il faire sérialisation vers et depuis XML un jeu d'enfant. http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx Vous pouvez en outre manipuler la sortie pour obtenir le format XML dont vous avez besoin.

Modifier pour vous répondre à répondre à votre question sur différentes propriétés qui ne peuvent intéresser mais voici ce qui pourrait être fait:

[Serializable] 
public struct SerializableKeyValuePair<TKey, TValue> 
{ 
    public TKey Key { get; set; } 

    public TValue Value { get; set; } 
} 

[Serializable] 
public class Input 
{ 
    public List<SerializableKeyValuePair<string, string>> PropertyBag { get; set; } 
} 

Cependant, vous ne contrôler autant que toutes les propriétés devront être un attribut OU un élément représenté en XML.

+0

la chose est que j'aurai une liste variable d'entrées donc j'espérais créer un type dynamique au lieu d'avoir des entités statiques – TommyTwist

+0

@TommyTwist tant que la structure des entrées est la même que vous pourrez sérialiser une liste entière (comme Liste ) avec facilité. – Craig

+0

@TommyTwist Voici un tutoriel sur le sujet au cas où il vous intéresse. http://www.switchonthecode.com/tutorials/csharp-tutorial-xml-serialization – Craig

Questions connexes