C# 使用 LINQ 查找具有特定属性名称和值的 XElement
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/10982167/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Find an XElement with a certain attribute name and value with LINQ
提问by Scott Selby
XDocument xDocument = XDocument.Load("...");
IEnumerable<XElement> elements = xDocument
.Element("lfm")
.Element("events")
.Elements("event");
try
{
foreach (XElement elm in elements)
{
comm.Parameters.AddWithValue("extID", elm.Element("id").Value ?? "");
comm.Parameters.AddWithValue("Title", elm.Element("title").Value ?? "");
comm.Parameters.AddWithValue("HeadlineArtist",
elm.Element("artists").Element("headliner").Value ?? "");
but I want the value of the element "image" with the attribute "size=large", I have been looking all night, and this is the closest I have come:
但我想要属性为“size=large”的元素“image”的值,我找了一整夜,这是我来的最接近的:
comm.Parameters.AddWithValue("LargeImage",
elm.Descendants("image")
.FirstOrDefault(i => (string)i.Attribute("size") == "large").Value);
Sample of the part of XML response:
XML 响应部分示例:
<lfm status="ok">
<events xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
location="Chicago, United States" page="1" perPage="1"
totalPages="341" total="341" festivalsonly="0" tag="">
<event xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#">
<id>3264699</id>
<title>Iron And Wine</title>
<artists>
<artist>Iron And Wine</artist>
<artist>Dr. John</artist>
<headliner>Iron And Wine</headliner>
</artists>
<venue>
<id>8915382</id>
<name>Ravinia Festival</name>
<location>
<city>Highland Park</city>
<country>United States</country>
<street>200 Ravinia Park Rd</street>
<postalcode>60035</postalcode>
<geo:point>
<geo:lat>42.15831</geo:lat>
<geo:long>-87.778409</geo:long>
</geo:point>
</location>
<url>http://www.last.fm/venue/8915382+Ravinia+Festival</url>
<website>http://www.ravinia.org/</website>
<phonenumber>847.266.5100</phonenumber>
<image size="small">http://userserve-ak.last.fm/serve/34/63026487.jpg</image>
<image size="medium">http://userserve-ak.last.fm/serve/64/63026487.jpg</image>
<image size="large">http://userserve-ak.last.fm/serve/126/63026487.jpg</image>
<image size="extralarge">http://userserve-ak.last.fm/serve/252/63026487.jpg</image>
采纳答案by Olivier Jacot-Descombes
Try
尝试
XElement result = elm.Descendants("image")
.FirstOrDefault(el => el.Attribute("size") != null &&
el.Attribute("size").Value == "large");
if (result != null) {
process result.Value ...
}
Starting with C#6.0 (VS 2015), you can write:
从 C#6.0 (VS 2015) 开始,您可以编写:
XElement result = elm.Descendants("image")
.FirstOrDefault(el => el.Attribute("size")?.Value == "large");
if (result != null) {
process result.Value ...
}
A non-obvious alternative (as @RandRandom pointed out) is to cast the Attribute to string:
一个不明显的替代方案(如@RandRandom 指出的)是将 Attribute 转换为string:
XElement result = elm.Descendants("image")
.FirstOrDefault(el => (string)el.Attribute("size") == "large");
if (result != null) {
process result.Value ...
}
This works, because because of XAttribute?Explicit?Conversion?(XAttribute?to?String).
这是有效的,因为XAttribute?Explicit?Conversion?(XAttribute?to?String)。
回答by Damith
you can use XPathSelectElement extension method
var node = elm.XPathSelectElement("descendant::image[@size='large']");
if (node!=null)
{
var path = node.Value;
}

