2010-08-17 4 views
1

Voici mon XMLLINQ to XML Obtenez le nœud suivant du même nom

<assets> 
    <asset> 
     <metadata Id="ItemType" Value="Image"/> 
     <metadata Id="ItemUri" Value="http://blah.png"/> 
    </asset> 
    <asset> 
     <metadata Id="ItemType" Value="Image"/> 
     <metadata Id="ItemUri" Value="http://blah2.png"/> 
    </asset> 
</assets> 

Comment puis-je obtenir la valeur de la 2ème <metadata> contenant l'URI?

List<Asset> assets = (from asset in xmlDocument.Descendants("asset") 
           select new Asset 
           { 
            ItemType = asset.Element("metadata").Attribute("Value").Value, 
            ItemUri = asset.Element("metadata").Attribute("Value").Value 
           }).ToList<Asset>(); 

Actuellement, mon code renvoie exactement la même valeur de la première <metadata> bien sûr.

Répondre

2

C'est ce que je fini par faire. Les réponses ci-dessus sont bonnes mais si les <metadata> ne sont pas en ordre, alors je vais recevoir les mauvaises données. De cette façon, je fais une requête et obtenir la bonne, peu importe l'ordre.

List<Asset> assets = (from asset in xmlDocument.Descendants("asset") 
           select new Asset 
           { 
            ItemType = asset.Elements().Single(x => x.Attribute("Id").Value == "ItemType").Attribute("Value").Value, 
            ItemUri = asset.Elements().Single(x => x.Attribute("Id").Value == "ItemUri").Attribute("Value").Value,  
           }).ToList<Asset>(); 
+0

j'avais up vote, mais je suis de votes pour la journée –

+0

je vais le faire pour vous ;-) +1 pour la solution de commande indépendante. Il est assez triste que tant de code doive être écrit pour une si petite chose: -/mais je ne sais pas comment cela pourrait être plus propre/plus petit ;-). –

0

Semble que .Element (..) obtient le premier élément avec le nom correspondant si plusieurs éléments sont présents. Vous pouvez modifier la requête LINQ à quelque chose comme

var assets = (from asset in doc.Descendants("asset") 
       let metadata = asset.Descendants("metadata").ToArray() 
       let type = metadata[0].Attribute("Value").Value 
       let uri = metadata[1].Attribute("Value").Value 
       select new Asset { ItemType = type, ItemUri = uri }).ToList(); 
0
var assets = (from asset in xmlDocument.Descendants("asset") 
       select new Asset 
       { 
        ItemType = (string)asset.Element("metadata").Attribute("Value"), 
        ItemUri = (string)asset.Elements("metadata").ElementAt(1).Attribute("Value") 
       }).ToList(); 
0

Ce code vous donnera un IEnumerable d'un certain type anonyme, mais vous savez déjà comment tourner dans le bon type.

var assets = from asset in xd.Descendants("asset") 
      from metaType in asset.Descendants("metadata") 
      from metaUri in asset.Descendants("metadata") 
      where metaType.Attribute("Id").Value == "ItemType" 
      && metaUri.Attribute("Id").Value == "ItemUri" 
      select new 
      { 
       ItemType = metaType.Attribute("Value").Value, 
       ItemUri = metaUri.Attribute("Value").Value 
      };