1

我正在尝试从 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>

那将是我试图将其转换为 SelectList 的 XML 字符串。这就是我正在尝试的方式...

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

现在我想这是因为我在这里只得到一个元素?但我不确定我会做些什么来做到这一点。

4

1 回答 1

4

我认为您的查询有问题,因为您应该遇到异常。

您正在尝试选择 的属性“键”和“值” <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"),您将获得相同的行为。

于 2012-05-30T19:47:44.567 回答