2009-10-14 5 views
2

Ci-dessous la doc xmlComment rechercher un noeud à l'aide de Linq to XML Query?

<Root> 
     <Global> 
     </Global> 
     <local> 
      <section name="A"> 
       <subsection name="A"> 
        <innersection name="A"> 
         <Property1> 
         </Property1> 
        </innersection> 
        <innersection name="B"> 
         <Property1> 
         </Property1> 
        </innersection> 
       </subsection> 
       <subsection name="B"> 
        <innersection name="A"> 
         <Property1> 
         </Property1> 
        </innersection> 
        <innersection name="B"> 
         <Property1> 
         </Property1> 
        </innersection> 
       </subsection> 
      </section> 
      <section name="B"> 
       <subsection name="A"> 
        <innersection name="A"> 
         <Property1> 
         </Property1> 
        </innersection> 
        <innersection name="B"> 
         <Property1> 
         </Property1> 
        </innersection> 
       </subsection> 
       <subsection name="B"> 
        <innersection name="A"> 
         <Property1> 
         </Property1> 
        </innersection> 
        <innersection name="B"> 
         <Property1> 
         </Property1> 
        </innersection> 
       </subsection> 
      </section> 
     </local> 
    </Root> 

Maintenant, je veux la property1 dont la section name = "B" et le nom du paragraphe = "B" et le nom Innersection = "B" en une seule requête en utilisant LINQ to XML.

Répondre

5

Voici mon opinion, alternative à Jon, en supposant Propriété1 se produit qu'une seule fois dans une Innersection et vous avez besoin seulement que celui-ci:

var Property1 = doc.Root.Elements("local").Elements("section") 
    .Where(x => x.Attribute("name") == "B").Elements("subsection") 
    .Where(x => x.Attribute("name") == "B").Elements("innersection") 
    .Where(x => x.Attribute("name") == "B").Element("Property1"); 
4

EDIT: Suppression du style de requête "normal" LINQ to XML, car ssg est meilleur. Je voulais cependant quitter la version XPath. Il est non testé, mais je pense que cela devrait fonctionner ...

var properties = doc.XPathSelectElements(
"//section[@name='B']/subsection[@name='B']/innersection[@name='B']/property1"); 
+0

ne serait-ce déplacement complet DOM au lieu de partir en filtrant vers le bas la section locale de sous? –

+0

Oui, ce serait le cas. Je soupçonne fortement que pour la plupart des cas de la vie réelle, cela fonctionnerait en un clin d'œil bien que :) –

+0

Cela est facilement résolu en faisant démarrer la requête avec '/ Root/local/section' plutôt que' // section'. –

1

Étant donné que cette question a également été marqué vb.net, voici l'équivalent de la requête de ssg dans vb.net:

Dim Property1 = doc.<local>.<section>.Where(Function(x) [email protected] = "B") _ 
          .<subsection>.Where(Function(x) [email protected] = "B") _ 
          .<innersection>.Where(Function(x) [email protected] = "B") _ 
          .<Property1>