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

本文关键字:XML 项目 面检索 应用程序 Windows 应用 | 更新日期: 2023-09-27 18:02:35

目标:我正在尝试从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>的大区块中,但我如何才能更深入地告诉读者获取特定字段?

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

使用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
}

一种可能性是使用XPath。它将允许您选择所需的节点。一旦设置好它,它就非常简单,并且可以很容易地使用它来检索其他节点。有关如何将其与Linq一起使用的示例,请参阅System.Xml.XPath和Extensions.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的示例,请参阅:如何在XDocument中使用XPath?以及使用XDocument解析XML。