2014-05-10 46 views
1

目標: 我想從XML文件檢索城市名稱如何檢索Windows商店應用從XML頁面項目

我使用的API,可以給我我需要的所有信息指示緯度經度

這是一個URL,以完整的XML,我現在用: http://dev.virtualearth.net/REST/v1/Locations/50,50?o=xml&key=Avu1gnmc6hy50Jsb-l3U_iTbKyOXI2wnsVS1tj7UMtwJxesB9WDZs_qyG0zKgpkZ

這裏是從XML的摘錄被返回,顯示了相關部分:

<?xml version="1.0" encoding="UTF-8"?> 
<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1"> 
    ... 
    <ResourceSets> 
     <ResourceSet> 
      <EstimatedTotal>1</EstimatedTotal> 
      <Resources> 
       <Location> 
        <Name>Kaztalovskiy rayon, Kazakhstan</Name> 
        ... 
        <Address> 
         <AdminDistrict>Batys Qazaqstan</AdminDistrict> 
         <CountryRegion>Kazakhstan</CountryRegion> 
         <FormattedAddress>Kaztalovskiy rayon, Kazakhstan</FormattedAddress> 
         <Locality>Kaztalovskiy rayon</Locality> 
        </Address> 
        ... 
       </Location> 
      </Resources> 
     </ResourceSet> 
    </ResourceSets> 
</Response> 

這是什麼我曾嘗試:

HttpClient Client = new HttpClient(); 

string Result = await Client.GetStringAsync("http://dev.virtualearth.net/REST/v1/Locations/ " + position.Coordinate.Latitude +", " + position.Coordinate.Longitude +"?o=xml&key=Avu1gnmc6hy50Jsb-l3U_iTbKyOXI2wnsVS1tj7UMtwJxesB9WDZs_qyG0zKgpkZ"); 

XDocument ResultDocument = XDocument.Parse(Result); 
XElement AddressElement = ResultDocument.Root.Element("ResourceSets"); 

string City = AddressElement.Element("Locality").Value; 

我需要這是很大<ResourceSets>塊內的信息。裏面有另一個叫<Address>的區塊。

我不知道如何從<Locality>字段中獲取內容,我知道它在<ResourceSets>的大塊中,但我該如何深入其中並告訴讀者讓我看看具體的字段?

回答

0

一種可能性是使用XPath。它將允許你選擇你想要的節點。一旦設置完成,它非常簡單,您可以非常輕鬆地使用它來檢索其他節點。有關如何將其與Linq一起使用的示例,請參閱System.Xml.XPathExtensions.XPathSelectElement

XPath允許您使用路徑位置語法來選擇您想要的節點。每個路徑步驟對應於其可以是元素,屬性,文本,等等。例如一個XML節點,則可以選擇使用XPath與Locality元件:

/Response/ResourceSets/ResourceSet/Resources/Location/Address/Locality 

還可以使用//跳過細節在這種情況下,例如:

/Response//Locality 

由於只有一個Locality在整個文檔中元素,你可以簡單地使用

//Locality 

您的文檔有點複雜,因爲它有名稱空間,XPath要求您爲每個屬於名稱空間的元素加上前綴。要做到這一點,您必須註冊關聯前綴的名稱空間,然後將該前綴添加到路徑中的每個元素。例如,如果你的ns1前綴映射到"http://schemas.microsoft.com/search/local/ws/rest/v1"命名空間,那麼你可以使用:

//ns1:Locality 

Ø檢索數據。

您可以使用System.Xml.XmlNamespaceManager註冊名稱空間,並在處理表達式時將其作爲參數傳遞。

如果只打算提取一個值,那麼忽略名稱空間並選擇本地名稱可能會更簡單。 //*選擇文件中所有元素的集合,並且[local-name()='Locality']將集合限制爲具有本地名稱Locality(忽略名稱空間)的元素。因此,你可以簡單地使用這個XPath表達式來檢索數據:

//*[local-name()='Locality'] 

有關如何使用XPath使用LINQ看到的例子:how to use XPath with XDocument?Parsing XML using XDocument

1

有一個簡單的方式與WinRT的XML API來做到這一點:

using Windows.Data.Xml.Dom; 

var uri = new Uri("http://dev.virtualearth.net/REST/v1/Locations/50,50?o=xml&key=Avu1gnmc6hy50Jsb-l3U_iTbKyOXI2wnsVS1tj7UMtwJxesB9WDZs_qyG0zKgpkZ"); 

try 
{ 
    var doc = await XmlDocument.LoadFromUriAsync(uri); 
    var lc = doc.GetElementsByTagName("Locality"); 

    if (lc != null && lc[0] != null) 
    { 
     //lc[0].InnerText is the piece you want 
    } 
    else 
    { 
     //Element not in the XML 
    } 
} 
catch 
{ 
    //Handle errors, e.g. no connectivity 
} 
相關問題