[英]XElement Sequence contains no elements why?
这是我要查询的XML:
<GeocodeResponse>
<status>OK</status>
<result>
<type>street_address</type>
<formatted_address>264 Mugga Ln, Canberra ACT, Australia</formatted_address>
<address_component>
<long_name>264</long_name>
<short_name>264</short_name>
<type>street_number</type>
</address_component>
<address_component>
<long_name>Mugga Lane</long_name>
<short_name>Mugga Ln</short_name>
<type>route</type>
</address_component>
<address_component>
<long_name>Canberra</long_name>
<short_name>Canberra</short_name>
<type>colloquial_area</type>
<type>locality</type>
<type>political</type>
</address_component>
<address_component>
<long_name>Australian Capital Territory</long_name>
<short_name>ACT</short_name>
<type>administrative_area_level_1</type>
<type>political</type>
</address_component>
</result>
</GeocodeResponse>
这是我的C#代码:
XElement localityname = xml.Element("result").Elements("address_component")
.Where(a => a.Element("type").Value == "locality")
.First().Element("long_name");
在大多数情况下,相同/相似的XML可以正常工作,而且我从查询中得到了一个值。
我正在寻找(并且大部分时间都有效)的词是“堪培拉”。
但是,为什么此XML崩溃并显示“序列不包含任何元素”?
xml中有多个type
节点,因此必须使用XDocument
来执行以下操作:
XDocument xdoc = XDocument.Parse(XML);
var element = xdoc.Descendants("result").Descendants("address_component")
.Where(x=>x.Descendants("type").Any(y=> y.Value == "locality"))
.First().Element("long_name");
我做了一个可行的小提琴例子
但是,如果该元素可能存在或不存在于xml中,则考虑使用FirstOrDefault()
,因为如果找不到与谓词条件匹配的元素,则它不会引发异常:
var element = xdoc.Descendants("result").Descendants("address_component")
.Where(x=>x.Descendants("type").Any(y=> y.Value == "locality"))
.FirstOrDefault();
if(element !=null)
{
var val = element.Element("long_name").Value;
}
如果xml
是您的XDocument
,那么您将忽略GeocodeResponse
元素。
此查询可能会更宽容(如果要查找的元素不存在,则返回null
):
var name = (string)doc.Descendants("address_component")
.Where(e => (string)e.Element("type") == "locality")
.Select(e => e.Element("long_name"))
.SingleOrDefault();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.