2010-08-24 4 views
0

У меня есть XML-файл следующим образом:Нужна вложенной LINQ к XML-запрос помощи

<?xml version="1.0" encoding="utf-8" ?> 

<publisher> 
<name>abc</name> 
<link>http://</link> 
<description>xyz</description> 

<category title="Top"> 
<item> 
<title>abc</title> 
<link>http://</link> 
<pubDate>1</pubDate> 
<description>abc</description> 
</item> 

<item> 
<title>abc</title> 
<link>http://</link> 
<pubDate>2</pubDate> 
<description>abc</description> 
</item> 


</category> 

<category title="Top2"> 
<item> 
<title>abc</title> 
<link>http://</link> 
<pubDate>1</pubDate> 
<description>abc</description> 
</item> 

<item> 
<title>abc</title> 
<link>http://</link> 
<pubDate>2</pubDate> 
<description>abc</description> 
</item> 
</category> 

</publisher> 

Мне нужно написать LINQ для запроса XML в C#, который возвращает все под «категории» метки на основе значения предоставленного атрибута. Я пробовал следующий код, но он дает мне ошибку. Любая помощь будет оценена:

 System.Xml.Linq.XElement xml = System.Xml.Linq.XElement.Parse(e.Result); 

     IEnumerable<string> items = from category in xml.Elements("category") 
        where category.Attribute("title").Value == "Top" 
        select category.ToString(); 
+0

Я почти уверен, что выбор должен приходите раньше. В любом случае, вставьте ошибку, пожалуйста. –

+0

«SELECT before WHERE» только правило SQL, а не LINQ. Описание ошибки поможет много. Для меня непонятно, почему поиск «Топ» выполняется, когда нет названия с «Верхним» значением. Больше исходного кода также может быть полезным. – Budda

+0

@Hamish @Budda: спасибо за ответ. Это то, что возвращается в «элементах» после выполнения запроса: System.Collections.Generic.IEnumerator .Current = 'System.Collections.Generic.IEnumerable ' не содержит определения для 'System' и нет методы расширения «System» принимать первый аргумент типа «System.Collections.Generic.IEnumerable » может быть найдено (вы пропали без вести с помощью DirectiV ... то, что я хочу, это все тегов возвращаемых в зависимости от значение категории, заданное в запросе. Например, «Топ», «Топ2» – Taimi

ответ

1
IEnumerable<string> items = from category in xml.Descendants("category") 
    where category.Attribute("title").Value == "Top" 
    select category.ToString(); 

Конечно, что собирается дать вам список с одной строки в нем. Если вы хотите просто строку в ней:

var items = (from category in xml.Descendants("category") 
      where category.Attribute("title").Value == "Top" 
      select category.ToString()).First(); 

Но, если вы хотите продолжить обработку XML, вы, вероятно, действительно хотите его как объект XElement:

var items = (from category in xml.Descendants("category") 
      where category.Attribute("title").Value == "Top" 
      select category).First(); 
+0

благодарит кучу Джеймса, третий запрос, который вы выложили выше, был тем, что я искал. Это сработало, как прелесть! – Taimi

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