我有一个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
有什么建议吗?感谢
答案 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,以防它帮助你。