2010-11-20 4 views
1

Итак, Noobie вопрос дня ...Linq для XML: Возвращение атрибутов из детей одного и того же имени и родителей одного и того же имени

У меня есть файл XML со следующей структурой:

<result> 
    <rowSet name="name"> 
    <row name="name1" /> 
    <row name="name2" /> 
    <row name="name3" /> 
    </rowSet> 
    <rowSet name="type"> 
    <row type="type1" /> 
    <row type="type2" /> 
    <row type="type3" /> 
    </rowSet> 

etc.. 

</result> 

Я пытался и, скорее, безуспешно, получить атрибуты строки из одного rowSet, основанного на имени атрибута rowSet:. Другими словами, я пытаюсь вытащить атрибуты из «строк», которые содержатся только в rowSet: Атрибут определенного имени.

Я попытался с помощью:

var rowSet = from rs in xmlDoc.Descendants("result") 
       where rs.Descendants("rowset").Attributes("name").Any(a => a.Value == "name") 
       select new 
       { 
        row = from r in xmlDoc.Descendants("row") 
          select new 
          { 
           skillID = r.Attribute("name"), 
          } 
       }; 

Однако это не дает более одного результата. Было довольно неприятно, и еще раз ... после того, как я попробовал 15 различных предложений, я не смог вспомнить исходный код для читателя.

Ответ был дан:

var rowNames = (from i in xmlDoc.Descendants("rowSet") 
       where (string)i.Attribute("name") == "name" 
       select i.Descendants("row")) // Had to move this last) to... 
       .Select(r => (string)r.Attribute("name")); // Here in order to get it to work 

Я считаю, что это работает, но я слишком noobish, чтобы узнать, как итерацию через него, несмотря на то, что я могу получить доступ к данным через «Просмотр результатов» из отладчик, когда программа запущена.


Хорошо, так что я в состоянии получить этот запрос для запуска вправо (путем перемещения «)» первый), и когда я начинаю шагать через код, то rowNames имеет значения в нем. Тем не менее, я был очень неудачным в отображении информации в любом случае. Я играю с этим в консольном приложении, fyi.

Итак, это первая проблема.

Второе, если я начну делать мой XML немного более сложным, добавив несколько атрибутов для элементов строки, как:

<result> 
    <rowSet name="name"> 
     <row fName="Ted" lName = "Happy" /> 
     <row name="Billy" lName = "Maddison"/> 
     <row name="John" lName = "Doe"/> 
    </rowSet> 
    <rowSet name="type"> 
     <row type="type1" type2 ="Hero"/> 
     <row type="type2" type2 ="Villain" /> 
     <row type="type3" type2 ="Neutral"/> 
    </rowSet> 
</result> 

Как тогда я получить все атрибуты элемента?

Это кажется таким основным, поэтому я чувствую себя довольно отсталым на данный момент.

+0

Можете ли вы уточнить желаемый результат? –

+0

Просто хотите вернуть атрибуты разных «строк». – Josh

ответ

0

Вы можете получить имена в одиночку достаточно легко:

var rowNames = from i in xmlDoc.Descendants("rowSet") 
       where (string)i.Attribute("name") == "name" 
       from r in i.Descendants("row") 
       select (string)r.Attribute("name"); 

Просто настроить струны, чтобы получить другой. (Вы можете бросить это в методе и использовать параметры, например.)

+0

См. OP, спасибо за ввод. – Josh

+0

Перемещение парса приведет к тому, что запрос будет вести себя по-разному. Пожалуйста, попробуйте точно мой ответ и повторите его следующим образом: 'foreach (строка str в rowNames) Console.WriteLine (str);' - вы должны увидеть все атрибуты, которые вы хотите, из первого ряда rowSet. – cdhowie

+0

Я получаю сообщение об ошибке: Ошибка 'System.Collections.Generic.IEnumerable ' не содержит определения для 'Attribute' и никакого метода расширения 'Attribute', принимающего первый аргумент типа «System.Collections.Generic.IEnumerable ' – Josh

-1

Это немного догадок, но вы имеете в виду:

from rs in xmlDoc.Descendants("result").Descendants("rowSet") 
where (string)rs.Attribute("name") == "name" 
from r in rs.Descendants("row") 
select new { skillID = (string)r.Attribute("type") } 
Смежные вопросы