2013-06-21 37 views
1

我對我的linq查詢針對XML文件存在輕微混淆的問題。它通過屬性值正確返回其中一個節點(GB)。但是,當我提供不同的屬性值時,例如:JE我收到sequence contains no elements錯誤,但該元素明顯存在於XML文檔中?通過屬性ID查詢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而不是其他人?

回答

2
n.Element("postCodeRegex") 

將返回該類型的第一個元素,並且只會檢查其「territoryId」。

,而不是與此此替換where子句:

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

編輯: 好了,你想匹配的postcoderegex項目。我以爲你想要第一個與比賽捆綁在一起的元素。 那麼解決方案就容易多了。

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

這將返回GB的正則表達式不管isoCode值 – DGibbs

+0

有一個1,因爲你使我最終的解決方案,雖然我認爲'Any()'是你的查詢的問題;) – DGibbs

+0

你需要在查詢的末尾添加一個'.Single().ToString()',但是這也可以工作:)乾杯 – DGibbs

0

解決,我只對第一個匹配元素檢查:

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