2010-09-14 38 views
1

有人可以幫我嗎? 我想從下面的XML中使用LINQ提取PostalCode,Latitude和Longitude值。我的努力導致一個null IEnumerable! XML已從BING REST服務器重新調用。 我敢肯定,這並不難,只是我的LINQ很差。 在此先感謝請幫助LINQ到XML與BING地圖

<?xml version="1.0"?> 
<GeocodeFeed > 
    <GeocodeEntity Id="1" xmlns="http://schemas.microsoft.com/search/local/2010/5/geocode"> 
    <GeocodeRequest Culture="en-GB" Query="RG6 1WG" /> 
<GeocodeEntity Id="1" xmlns="http://schemas.microsoft.com/search/local/2010/5/geocode"> 
    <GeocodeRequest Culture="en-GB" Query="RG6 1WG" /> 
    <GeocodeResponse DisplayName="RG6 1WG, Wokingham, United Kingdom" EntityType="Postcode1" Confidence="High" StatusCode="Success"> 
     <Address AdminDistrict="England" CountryRegion="United Kingdom" FormattedAddress="RG6 1WG, Wokingham, United Kingdom" PostalCode="RG6 1WG" /> 
     <RooftopLocation Latitude="51.461179330945" Longitude="-0.925943478941917" /> 
    </GeocodeResponse> 
</GeocodeEntity></GeocodeFeed> 
+0

你能告訴我們你試過的代碼嗎? – 2010-09-14 22:35:39

+0

只是一個猜測,但要確保您使用的是名稱空間,如果不包含名稱空間,Linq to XML將返回一個空集。 – 2010-09-15 06:19:39

回答

1

我假設,如果一個GeocodeResponse有一個地址元素,它也有一個RooftopLocation元素。

XDocument document = XDocument.Load(<your feed>); 
IEnumerable<XElement> responses = document.XPathSelectElement("//GeocodeEntity/GeocodeResponse[Address]"); 

foreach (XElement response in responses) 
{ 
    string postalCode = response.Element("Address").Attribute("PostalCode").Value; 
    string latitude = response.Element("RooftopLocation").Attribute("Latitude").Value; 
    string longitude = response.Element("RooftopLocation").Attribute("Longitude").Value; 
} 

我們希望,這應該讓你開始你想要去...

1

感謝Neil.T:您的代碼也不太工作,但給了我足夠去,非常感謝。 這是我的第一個解決方案,我確定它可以被重構等。 在使用LINQ之前,我有一些非常討厭的正則表達式來完成這項工作,幸好在這個解決方案中它們是過去的事情。

 float latitude, longitude; 
     string postalCode; 
     XDocument loaded = XDocument.Load(url); 
     IEnumerable<XNode> responses = loaded.DescendantNodes(); 
     foreach (XElement response in responses) 
     { 
      if (response.Name.LocalName.Equals("Address")) 
      { 
       postalCode = response.Attribute("PostalCode").Value; 
      } 
      if (response.Name.LocalName.Equals("RooftopLocation")) 
      { 
       latitude = float.Parse(response.Attribute("Latitude").Value); 
       longitude = float.Parse(response.Attribute("Longitude").Value); 
      } 
     }