c # linq to xml к списку - PullRequest
       203

c # linq to xml к списку

4 голосов
/ 08 апреля 2010

Мне было интересно, есть ли способ получить список результатов в список с linq to xml. Если бы у меня был следующий xml, например:

<?xml version="1.0"?>
<Sports xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SportPages>
        <SportPage type="test">
            <LinkPage>
                <IDList>
                    <string>1</string>
                    <string>2</string>
                </IDList>
            </LinkPage>
        </SportPage>
    </SportPages>
</Sports>

Как я могу получить список строк из IDList?

Я довольно новичок в linq to xml, поэтому я только что попробовал кое-что, сейчас я нахожусь на этом этапе:

var IDs = from sportpage in xDoc.Descendants("SportPages").Descendants("SportPage")
                      where sportpage.Attribute("type").Value == "Karate"
                      select new
                      {
                          ID = sportpage.Element("LinkPage").Element("IDList").Elements("string")
                      };

Но вар хаотично читать прилично. Разве нет способа, которым я мог бы просто получить список строк из этого?

Спасибо

Ответы [ 5 ]

6 голосов
/ 08 апреля 2010

Этот запрос работает - проверено и подтверждено:

var ID2 = (from sportpage in xDoc.Descendants("SportPages").Descendants("SportPage")
           where sportpage.Attribute("type").Value == "Karate"
           select sportpage)
          .Descendants("LinkPage")
          .Descendants("IDList")
          .Elements("string")
          .Select(d => d.Value)
          .ToList();

Дает мне список из двух строк: "1" и "2".

2 голосов
/ 08 апреля 2010
var myStrings = xDoc.Descendants("SportPage")
                    .Where(d => d.Attribute("type").Value == "Karate")
                    .Descendants("IDList")
                    .Descendants("string")
                    .Select(d => d.Value);

чтобы увидеть вашу строку:

xDoc.Descendants("SportPage")
    .Descendants("IDList")
    .Where(d => d.Attribute("type").Value == "Karate")
    .Descendants("string")
    .Select(d => d.Value)
    .ToList()
    .ForEach(Console.WriteLine);
1 голос
/ 08 апреля 2010

Ты имеешь в виду это?

List<string> IDs = xDoc.Descendants("SportPages").Descendants("SportPage")
    .Where( anySportPage => anySportpage.Attribute("type").Value == "Karate" )
    .Select( karateSportPage => karateSportpage.Element("LinkPage").Element("IDList").Elements("string"))
    .ToList();
0 голосов
/ 08 апреля 2010

Самой большой проблемой, с которой вы столкнулись, было то, что вы не взяли .Value из возвращенного набора элементов. Но вот еще один способ сделать это.

var ids = from sportPage in xDoc.Descendants("SportPage")
          let attrib = sportPage.Attribute("type")
          where attrib != null
          let type = attrib.Value
          where !string.IsNullOrEmpty(type)
              && type == "Karate"
          from id in sportPage.Descendants("IDList").Elements()
          select id.Value;
0 голосов
/ 08 апреля 2010

Я думаю, что причина, по которой вы находите хаотичный "var", заключается в том, что вы создали анонимный тип с "новым" в вашем выборе Если вы просто выберете один элемент, который вам нужен, тогда переменная не будет анонимного типа.

, например

select sportpage.Element("LinkPage").Element("IDList").Elements("string");

Однако, я бы предпочел сделать это, используя. обозначение, как это.

List<string> ids = xDoc.Elements("SportPages").Elements("SportPage").Where(sportPage => sportPage.Attribute("type").Value == "Karate").Elements("LinkPage").Elements("IDList").Elements("string").Select(id => id.Value).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...