如何在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>
的大区块中,但我如何才能更深入地告诉读者获取特定字段?
使用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。