2009-10-14 2 views
2

Ниже XML документКак выполнить поиск узла с помощью запроса Linq to XML?

<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> 

Теперь я хочу property1 которого раздел имя = «B» и подраздел имя = «B» и innersection имя = «B» в одном запросе с помощью LINQ к XML.

ответ

5

Вот мое взятие, альтернатива Джона, предполагая, что property1 происходит только один раз внутри innersection и вам нужно только, что один:

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: удалено LINQ в XML «нормальный» стиль запроса, поскольку ssg лучше. Однако я хотел оставить версию XPath. Это проверялось, но я думаю, что он должен работать ...

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

Не будет ли этот проход завершен DOM вместо того, чтобы начинать с фильтрации по секциям вниз по локальной? –

+0

Да, это было бы. Я очень подозреваю, что для большинства случаев реальной жизни это будет работать в мгновение ока, хотя :) –

+0

Это легко устранить, если начать запрос с '/ Root/local/section', а не' // section'. –

1

Так как этот вопрос был также отмечен vb.net, вот эквивалент запроса ssg в 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> 
Смежные вопросы