目标: 我正在尝试从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>
的大块中,但我怎样才能更深入地告诉读者给我那个特定的领域?
答案 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.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的示例,请参阅:how to use XPath with XDocument?和Parsing XML using XDocument。