Как найти элемент, не зная, насколько глубоко он вложен с помощью Linq в XML?

#c# #xml #linq-to-xml

#c# #xml #linq-to-xml

Вопрос:

У меня есть XML-документ, который выглядит следующим образом:

 <BrowseNodes>
<BrowseNode>
  <BrowseNodeId>4075981</BrowseNodeId>
  <Name>Nutrition Bars</Name>
  <Ancestors>
  <BrowseNode>
     <BrowseNodeId>4075971</BrowseNodeId>
     <Name>Nutrition Bars amp;amp; Drinks</Name>
        <Ancestors>
        <BrowseNode>
            <BrowseNodeId>3764441</BrowseNodeId>
            <Name>Diet amp;amp; Nutrition</Name>
            <Ancestors>
            <BrowseNode>
                <BrowseNodeId>3760931</BrowseNodeId>
                <Name>Products</Name>
                <IsCategoryRoot>1</IsCategoryRoot>
                <Ancestors>
                <BrowseNode>
                   <BrowseNodeId>3760901</BrowseNodeId>
                   <Name>Health amp;amp; Personal Care</Name>
                </BrowseNode>
                </Ancestors>
             </BrowseNode>
             </Ancestors>
          </BrowseNode>
          </Ancestors>
       </BrowseNode>
      </Ancestors>
 </BrowseNode>
</BrowseNodes>
  

Я хочу выполнить запрос XLINQ, чтобы найти корень категории. Как это сделать, не указывая, сколько предков на самом деле может быть включено?

Комментарии:

1. Что такое Category ? Я не вижу этого узла в вашей разметке.

2. Что вы имеете в виду под «корнем категории»? Можете ли вы привести нам пример — что такое запрос и каков ожидаемый результат?

3. @JamesJohnson <IsCategoryRoot>1</IsCategoryRoot>

4. @JoeTyman: Понял. Я думаю, Дейвшоу вас просветил.

5. @KierenJohnstone Я хочу перейти к браузерному узлу с именем Heath amp; Personal Care

Ответ №1:

Вы должны использовать свойство Descendants.

 var node = 
  XElement.Parse(xmlString)
  .Descendants()
  .Where(xe => xe.Element("IsCategoryRoot") != null amp;amp; xe.Element("IsCategoryRoot").Value == "1");