2010-01-16 5 views
4

J'ai un xml doc semblable à ceci:Recherche doc XML avec LINQ

<Root> 

    <MainItem ID="1"> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
    </MainItem> 
    <MainItem ID="2"> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
    </MainItem> 

    ... 
</Root> 

Je veux retourner l'ensemble de l'élément MainItem en fonction de la valeur d'ID d'attribut. Donc, si l'ID d'attribut est égal à 2, donnez-moi cet élément MainItem.

Je n'arrive pas à comprendre comment faire cela avec LINQ. Il semble y avoir beaucoup d'informations sur google, mais je n'arrive pas à trouver ce que je cherche.

Petite aide?

TIA

:-)

+0

Merci pour l'édition Bruno! – JustAPleb

Répondre

2

Il pourrait être quelque chose comme ceci:

 XDocument doc = XDocument.Load("myxmlfile.xml"); 
     XElement mainElement = doc.Element("Root") 
            .Elements("MainItem") 
            .First(e => (int)e.Attribute("ID") == 2); 
     // additional work 
+1

Sachez simplement que l'appel à '.First()' lèvera une exception s'il n'y a pas d'élément correspondant. Utilisez '.FirstOrDefault()' si vous voulez éviter l'exception et récupérer une valeur NULL si rien n'est trouvé. –

+0

Will marc, merci. – JustAPleb

+1

J'utiliser '(int) e.Attribute (" ID ") == 2'. – AnthonyWJones

0

D'ici: How to: Filter on an Attribute (XPath-LINQ to XML)

// LINQ to XML query 
IEnumerable<XElement> list1 = 
    from el in items.Descendants("MainItem") 
    where (string)el.Attribute("ID") == "2" 
    select el; 

// XPath expression 
IEnumerable<XElement> list2 = items.XPathSelectElements(".//MainItem[@ID='2']"); 
+0

Merci pour l'aide! Très appréciée. – JustAPleb

+0

-1 pour XpathSelect(). Ce n'est pas la façon linq. –

+0

Comme vous avez probablement noté, je viens de citer une page Microsoft sur le sujet –

2

Que diriez-vous ceci:

// load your XML 
XDocument doc = XDocument.Load(@"D:\linq.xml"); 

// find element which has a ID=2 value 
XElement mainItem = doc.Descendants("MainItem") 
          .Where(mi => mi.Attribute("ID").Value == "2") 
          .FirstOrDefault(); 

if(mainItem != null) 
{ 
    // do whatever you need to do 
} 

Marc

+0

Merci pour l'aide! Très appréciée. – JustAPleb

2

Je changé XML légèrement pour avoir des valeurs:

<?xml version="1.0"?> 
<Root> 
    <MainItem ID="1"> 
     <SubItem>value 1</SubItem> 
     <SubItem>val 2</SubItem> 
     <SubItem></SubItem> 
    </MainItem> 
    <MainItem ID="2"> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
     <SubItem></SubItem> 
    </MainItem> 
</Root> 

Et avec cette LINQ:

XDocument xmlDoc = XDocument.Load(@"C:\test.xml"); 
var result = from mainitem in xmlDoc.Descendants("MainItem") 
      where mainitem.Attribute("ID").Value == "1" 
      select mainitem; 


foreach (var subitem in result.First().Descendants()) 
{ 
    Console.WriteLine(subitem.Value); 
} 

Console.Read(); 
+0

Bien, merci. Je pense que j'ai besoin d'un livre décent sur LINQ ... autre chose à ajouter à la liste ;-) – JustAPleb