Linq to XML: возвращение атрибутов от детей с одинаковыми именами и родителей с одинаковыми именами - PullRequest
1 голос
/ 20 ноября 2010

Итак, вопрос дня нуби ...

У меня есть 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: атрибут определенного имени.

Я пытался использовать:

    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

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


OkТаким образом, я могу заставить этот запрос работать правильно (сначала переместив «)», и когда я начинаю шагать по коду, в 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>

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

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

Ответы [ 2 ]

0 голосов
/ 20 ноября 2010

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

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 голосов
/ 20 ноября 2010

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

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") }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...