2012-05-30 34 views
1

我试图从一个XML字符串得到一个选择列表...XML来的SelectList使用LINQ

<?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

我认为你的查询有问题,因为你应该会得到一个异常。

您正试图选择<selectListItemDefinition>的属性“键”和“值”,但它们不存在。而您在select子句中实际上并未使用listItem

你的第一行是返回一个名为“selectListItemDefinition”的所有节点的IEnumerable<XElement>。你的第二行只是取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%肯定,你的XML文档中称为<item>的唯一元素是你想要的那些,可以更换第一和第二线带单一的from listItem in xDoc.Descendants("item"),你会得到同样的行为。

+0

谢谢。我最终做了类似的事情。这LINQ到XML是一个真正的熊。 – SoftwareSavant