【问题标题】:How to retrieve item from XML page in Windows Store app如何从 Windows 应用商店应用程序中的 XML 页面检索项目
【发布时间】:2014-05-13 00:39:25
【问题描述】:

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

我正在使用一个 api,它可以通过指示 latitudelongtitude 为我提供我需要的所有信息。

这是我正在使用的完整 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;

我需要获取 &lt;ResourceSets&gt; 大块内的信息。里面有另一个块,叫做&lt;Address&gt;

我不确定如何从中获取&lt;Locality&gt; 字段的内容,我知道它在&lt;ResourceSets&gt; 的大块中,但我怎样才能更深入地了解它并告诉读者让我知道具体领域?

【问题讨论】:

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


    【解决方案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
    }
    

    【讨论】:

      【解决方案2】:

      一种可能性是使用 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']
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多