繁体   English   中英

XElement序列为什么不包含任何元素?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM