Группировка Linq в XML с помощью предикатов

#xml #linq #linq-to-xml

#xml #linq #linq-to-xml

Вопрос:

С помощью приведенного ниже xml, как я могу сгруппировать следующее по str/@itemNo тогда и только тогда, когда arr[@name = 'ATR_IsFamily'] / str = 1

 <root>
  <doc>
    <arr name="ATR_IsFamily">
      <str>0</str>
    </arr>
    <arr name="ATR_VendorId">
      <str>I23</str>
    </arr>
    <str name="itemNo">ABCDEFGHIJ</str>
  </doc>
  <doc>
    <arr name="ATR_IsFamily">
      <str>1</str>
    </arr>
    <arr name="ATR_VendorId">
      <str>I23</str>
    </arr>
    <str name="itemNo">123456789</str>
  </doc>
</root>
  

Это то, что у меня есть до сих пор:

 var searchResults = from rt in element.Descendants("doc").Descendants("str")
    where (String)rt.Attribute("name") == "itemNo" 
        amp;amp; rt.Parent.Descendants("arr").ElementAt(1).Value == "1"
    group rt by new { d = (String)rt.Value.Substring(0,6) } into grp
    select grp;
  

В этом состоянии я и застрял:

 rt.Parent.Descendants("arr").ElementAt(1).Value == "1"
  

Как мне установить это условие?

Ответ №1:

Пара вещей:

  • rt.Parents.Потомки («arr») вернут вам IEnumerable<XElement> с двумя элементами. С помощью .В элементе(1) вы бы выбрали второй элемент, который был бы ATR_VendorId . Вы бы хотели .Элементат(0).

  • Во-вторых, вы захотите выбрать узел str под этим элементом <arr>, поэтому вам, вероятно, понадобится что-то вроде rt.Родители.Потомки («arr»).Элементат(0).Элемент («str»).Значение