#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»).Значение