按属性值查找XElement

8 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> 
Run Code Online (Sandbox Code Playgroud)

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

string cityName = simpleData.Where(a => a.Attribute("name").Value == "name").Select(a => a.Value).ToString();
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?谢谢

小智 16

string cityName = (simpleData.Where(a => a.Attribute("name").Value == "name")
                  .Select(a => a.Value)).FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

要么

(from x in simpleData
where x.Attribute("name").Value == "name"
select x.Value).FirstOrDefault()
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我建议使用`(string)Attribute("name")`over`Attribute("name").Value` - 它是一样的,除了它首先进行空检查.由于`Attribute()`在没有具有此类名称的属性退出元素时返回`null`,因此第一个这样的元素将在当前写入的查询中触发`NullReferenceException`. (5认同)
  • 1)购买一本关于XML的书.任何书.2)找到第三方.3)用这本书打败他们. (3认同)