XML для SelectList с использованием LINQ

Я пытаюсь получить список выбора из строки XML...

<?xml version="1.0" encoding="utf-8"?>
<selectListItemDefinition id="UPMCTypes">
  <item key="bla1" value="bla" />
  <item key="bla2" value="bla" />
  <item key="bla3" value="bla" />
  <item key="bla4" value="bla" />
  <item key="bla5" value="bla" />
  <item key="bla6" value="bla" />
  <item key="bla7" value="bla" />
  <item key="bla8" value="bla" />
  <item key="bla9" value="bla" />
  <item key="bla10" value="bla" />
  <item key="bla11" value="bla" />
</selectListItemDefinition>

Это будет строка XML, которую я пытаюсь превратить в список Select List. Вот как я пытаюсь это сделать...

List<SelectListItem> SListItem =
(
    from xmlSList in xDoc.Descendants("selectListItemDefinition")
    let listItem = xmlSList.Elements("item")
    select new SelectListItem
    {
        Key = xmlSList.Attribute("key").Value,
        Value = xmlSList.Attribute("value").Value
    }
).ToList();

Это только первый ключ-значение для меня.

Key    "blah1"  string
Value  "blah"   string

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

1 ответ

Решение

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

Вы пытаетесь выбрать атрибуты "ключ" и "значение" из <selectListItemDefinition>, но они не существуют. И вы на самом деле не используете listItem в вашем предложении выбора.

Ваша первая строка возвращает IEnumerable<XElement> всех узлов с именем "selectListItemDefinition". Ваша вторая строка просто принимает это IEnumerable<> и присвоение дочерних элементов с именем "item" его переменной с именем listItem,

Когда вы должны сделать это второй запрос, чтобы перебрать <selectListItemDefinition> элементы вместо того, чтобы назначать его.

Так замени let listItem = xmlSList.Elements("item") с from listItem in xmlSList.Elements("item") и он должен вести себя так, как вы ожидаете.

полный запрос будет:

var SListItem = 
                (
                    from xmlSList in xDoc.Descendants("selectListItemDefinition")
                    from listItem in xmlSList.Elements("item")
                    select new SelectListItem
                    {
                        Key = listItem .Attribute("key").Value,
                        Value = listItem .Attribute("value").Value
                    }
                ).ToList();

И если вы на 100% уверены, что единственные элементы называются <item> в вашем XML-документе есть те, которые вы хотите, вы можете заменить первую и вторую строки одной from listItem in xDoc.Descendants("item") и вы получите такое же поведение.

Другие вопросы по тегам