如何从Windows应用商店应用中的XML页面检索项目

时间:2014-05-10 08:27:02

标签: c# xml windows-store-apps linq-to-xml

目标: 我正在尝试从xml文件中检索城市名称

我正在使用api,它可以通过指示纬度经度向我提供所需的所有信息。

这是我正在使用的完整XML的URL: 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>的大块中,但我怎样才能更深入地告诉读者给我那个特定的领域?

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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

o检索您的数据。

您可以使用System.Xml.XmlNamespaceManager注册命名空间,并在处理表达式时将其作为参数传递。

如果您只想提取那个值,那么忽略命名空间并选择本地名称可能更简单。 //*选择文件中的所有元素集合,[local-name()='Locality']将集合限制为具有本地名称Locality的元素(忽略名称空间)。因此,您只需使用此XPath表达式来检索数据:

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

有关如何在Linq中使用XPath的示例,请参阅:how to use XPath with XDocument?Parsing XML using XDocument