2015-04-15 3 views
0

Мне нужно сгруппировать следующие XML, используя LINQ to XML или XPath, с помощью param/Type. С группировкой я хотел бы получить какое-либо значение (или, во-первых, не имеет значения) id тег.Группировка в LINQ to XML с «любой» или первой «агрегацией»

<list> 
<item> 
    <id>1</id> 
    <param> 
     <type>A</type> 
    </param> 
</item> 
<item> 
    <id>2</id> 
    <param> 
     <type>A</type> 
    </param> 
</item> 
<item> 
    <id>3</id> 
    <param> 
     <type>B</type> 
    </param> 
</item> 
<item> 
    <id>4</id> 
    <param> 
     <type>B</type> 
    </param> 
</item> 

желательные результаты является

A - 1 
B - 3 

Я попытался

var content = from item in doc.Descendants("item").Descendants("param") 
group item by new 
{ 
     mType = (String)item.Element("type"),             
} into g 
select new 
{ 
    mType = g.Key.mType,        
}; 

но я не могу понять, как ссылаться на ID, который выше в иерархии, или как ссылаться на PARAM/TYPE при выборе ID.

+0

Чистые запросы на ввод кода не относятся к теме при переполнении стека - мы ожидаем, что вопросы здесь относятся к * конкретным * проблемам программирования, но мы, , с радостью поможем вам сами написать! Сообщите нам [что вы пробовали] (http://whathaveyoutried.com), и где вы застряли. Это также поможет нам лучше ответить на ваш вопрос. – CoderDennis

ответ

2

Я хотел бы предложить using System.Xml.Linq (XDocument)

Если мое понимание хорошо, вот что я сделал:

var xml = "<list><item><id>1</id><param><type>A</type></param></item><item><id>2</id><param><type>A</type></param></item><item><id>3</id><param><type>B</type></param></item><item><id>4</id><param><type>B</type></param></item></list>"; 
var document = XDocument.Parse(xml); 

foreach (var param in document.Root.Elements("item").GroupBy(i => i.Element("param").Element("type").Value)) 
{ 
    var firstId = param.First().Element("id").Value; 
    Console.WriteLine ("The first of {0} = {1}", param.Key, firstId); 
} 

выход:

The first of A = 1 
The first of B = 3 
+0

Блестящий. Этот подход работает хорошо! –

0

В дополнение к что было предложено Седриком, вы могли бы сделать то же самое в чистом XPath:

var xml = "<list><item><id>1</id><param><type>A</type></param></item><item><id>2</id><param><type>A</type></param></item><item><id>3</id><param><type>B</type></param></item><item><id>4</id><param><type>B</type></param></item></list>"; 
var document = XDocument.Parse(xml); 

// start at the root, then grab the first item element which has a param/type element whose value is equal to 'B' 
var answer = document.Root.XPathSelectElement("./item[./param/type='B'][1]").Element("id").Value; 

В XPath квадратные скобки эффективно функционируют как предложение where. Мой первый набор квадратных скобок квалифицирует, что я хочу элемент, содержащий соответствующий элемент param/type. Второй набор квадратных скобок ограничивает это до первого совпадения.

Смежные вопросы