按属性ID查询XML文件时,序列不包含任何元素

本文关键字:何元素 包含任 元素 查询 ID 属性 XML 文件 | 更新日期: 2023-09-27 18:19:28

我对XML文件的linq查询遇到了一个稍微令人困惑的问题。它按属性值正确地返回其中一个节点(GB)。但是,当我提供一个不同的属性值时,例如:JE我收到一个sequence contains no elements错误,但XML文档中清楚地存在该元素?

这是我的问题:

return (from n in xml.Descendants("postalCodeData")
        where n.Element("postCodeRegex").Attribute("territoryId").Value == isoCode
        select n.Element("postCodeRegex").Value).Single().ToString();

以下是一些示例XML数据:

<postalCodeData>
  <postCodeRegex territoryId="GB" >GIR[ ]?0AA|((AB|AL|B|BA|BB|BD|BH|BL|BN|BR|BS|BT|CA|CB|CF|CH|CM|CO|CR|CT|CV|CW|DA|DD|DE|DG|DH|DL|DN|DT|DY|E|EC|EH|EN|EX|FK|FY|G|GL|GY|GU|HA|HD|HG|HP|HR|HS|HU|HX|IG|IM|IP|IV|JE|KA|KT|KW|KY|L|LA|LD|LE|LL|LN|LS|LU|M|ME|MK|ML|N|NE|NG|NN|NP|NR|NW|OL|OX|PA|PE|PH|PL|PO|PR|RG|RH|RM|S|SA|SE|SG|SK|SL|SM|SN|SO|SP|SR|SS|ST|SW|SY|TA|TD|TF|TN|TQ|TR|TS|TW|UB|W|WA|WC|WD|WF|WN|WR|WS|WV|YO|ZE)('d['dA-Z]?[ ]?'d[ABD-HJLN-UW-Z]{2}))|BFPO[ ]?'d{1,4}</postCodeRegex>
  <postCodeRegex territoryId="JE" >JE'd['dA-Z]?[ ]?'d[ABD-HJLN-UW-Z]{2}</postCodeRegex>
  <postCodeRegex territoryId="GG" >GY'd['dA-Z]?[ ]?'d[ABD-HJLN-UW-Z]{2}</postCodeRegex>
</postalCodeData>

有人能认出我做错了什么吗?为什么这对GB有效,而对其他人无效?

按属性ID查询XML文件时,序列不包含任何元素

n.Element("postCodeRegex") 

将返回该类型的第一个元素,并且只检查其"territoryId"。

将where子句替换为:

 where n.Elements("postCodeRegex").Any(element=>element.Attribute("territoryId").Value == isoCode)

编辑:好的,所以你想要匹配的后现代主义项目。我以为你想要的是第一个与火柴捆绑在一起的元素。那么解决方案就容易多了。

return (from n in xml.Descendants("postCodeRegex")
  where n.Attribute("territoryId").Value == isoCode
  select n.ToString();

解决后,我只检查第一个匹配的元素:

return (from n in xml.Descendants("postalCodeData").Elements("postCodeRegex")
        where n.Attribute("territoryId").Value == isoCode
        select n.Value).Single().ToString();