按属性值查找XElement

时间:2009-10-28 19:49:26

标签: attributes linq-to-xml

我有一个IEnumerables的集合,每个都有一个不同的属性值,对应于我的业务对象上的不同属性。以下是我要查询的XML示例:

  <SimpleData name="zip">60004</SimpleData>
  <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData>
  <SimpleData name="state">IL</SimpleData>
  <SimpleData name="countyname">COOK</SimpleData>
  <SimpleData name="lat">42.1121336684356</SimpleData>
  <SimpleData name="lon">-87.9736682731814</SimpleData> 

我认为我的linq2xml lambda很接近(在搜索MSDN和SO之后),但我似乎无法恰到好处地调整它:

string cityName = simpleData.Where(a => a.Attribute("name").Value == "name").Select(a => a.Value).ToString();

cityName的值被分配给“System.Linq.Enumerable + WhereSelectEnumerableIterator`2 [System.Xml.Linq.XElement,System.String]”而不是ARLINGTON HEIGHTS

有什么建议吗?感谢

2 个答案:

答案 0 :(得分:16)

string cityName = (simpleData.Where(a => a.Attribute("name").Value == "name")
                  .Select(a => a.Value)).FirstOrDefault();

(from x in simpleData
where x.Attribute("name").Value == "name"
select x.Value).FirstOrDefault()

返回IEnumerable<string>(Linq扩展方法几乎总是返回集合而不是单个实例),其中包含name属性等于name的所有元素值。然后我们选择第一个,或null如果它是空的。

此外,XML是可怕的,应该被拍摄。

答案 1 :(得分:3)

如果你有XML:

<SimpleDataList>
   <SimpleData name="zip">60004</SimpleData>  
   <SimpleData name="name">ARLINGTON HEIGHTS</SimpleData>  
   <SimpleData name="state">IL</SimpleData>  
   <SimpleData name="countyname">COOK</SimpleData>  
   <SimpleData name="lat">42.1121336684356</SimpleData>  
   <SimpleData name="lon">-87.9736682731814</SimpleData>
</SimpleDataList>

加载在XElement / XDocument SimpleDataList中,您可以使用XPath查询:

SimpleDataList.XPathSelectElement(@"//SimpleDataList/SimpleData[@Name=""name""]");

但我不确定你是否有一个XElement开头或一个简单的IEnumerable ......无论如何......我想我会提到XPath,以防它帮助你。