簡體   English   中英

使用XDocument.Load加載XML的后代

[英]Loading Descendants of XML using XDocument.Load

我正在嘗試使用XDocument.Load訪問一些經度和緯度數據。 這是示例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">
  <Copyright>Copyright © 2016 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.</Copyright>
  <BrandLogoUri>http://dev.virtualearth.net/Branding/logo_powered_by.png</BrandLogoUri>
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
  <TraceId>31a206847f9341d28689e0e7185e163d|DB40051719|7.7.0.0|DB4SCH010061262</TraceId>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
      <Resources>
        <Location>
          <Name>SW1A 1AA, London, London, United Kingdom</Name>
          <Point>
            <Latitude>51.501018524169922</Latitude>
            <Longitude>-0.14159967005252838</Longitude>
          </Point>
          <BoundingBox>
            <SouthLatitude>51.497155806599245</SouthLatitude>
            <WestLongitude>-0.14987251765942367</WestLongitude>
            <NorthLatitude>51.5048812417406</NorthLatitude>
            <EastLongitude>-0.1333268224456331</EastLongitude>
          </BoundingBox>
          <EntityType>Postcode1</EntityType>
          <Address>
            <AdminDistrict>England</AdminDistrict>
            <AdminDistrict2>London</AdminDistrict2>
            <CountryRegion>United Kingdom</CountryRegion>
            <FormattedAddress>SW1A 1AA, London, London, United Kingdom</FormattedAddress>
            <Locality>London</Locality>
            <PostalCode>SW1A 1AA</PostalCode>
          </Address>
          <Confidence>High</Confidence>
          <MatchCode>Good</MatchCode>
          <GeocodePoint>
            <Latitude>51.501018524169922</Latitude>
            <Longitude>-0.14159967005252838</Longitude>
            <CalculationMethod>Rooftop</CalculationMethod>
            <UsageType>Display</UsageType>
          </GeocodePoint>
        </Location>
      </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>

這是我嘗試訪問緯度和經度的代碼;

    string latitude = XDocument.Load(@"test.xml").Root
                                            .Descendants("ResourceSets")
                                            .Descendants("ResourceSet")
                                            .Descendants("Resources")
                                            .Descendants("Location")
                                            .Descendants("GeocodePoint")
                                            .Select(element => element.Attribute("Latitude").Value).FirstOrDefault();

但這將返回一個空字符串。 如何正確瀏覽文件?

如果要獲取所有GeocodePoint節點,則無需調用倍數級Descendants方法。 您只能這樣做:

XNamespace ns =  "http://schemas.microsoft.com/search/local/ws/rest/v1";
string latitude = XDocument.Load(@"test.xml")
                  .Descendants(ns+"GeocodePoint")
                  .Select(e=> (string)e.Element(ns+"Latitude"))
                  .FirstOrDefault();

通過該調用,Linq to XML將檢索xml中的所有GeocodePoints

如果要獲取經度和緯度值,則可以將其投影為匿名類型或自定義類(DTO),如下所示:

XNamespace ns =  "http://schemas.microsoft.com/search/local/ws/rest/v1";

var coord= XDocument.Load(@"xml.xml")
          .Descendants(ns+"GeocodePoint").Select(e => new { Lat = (string)e.Element(ns+"Latitude"), Lng = (string)e.Element(ns+"Longitude") })
          .FirstOrDefault();

關於你的問題

您的問題是您正在調用Attribute方法來獲取“ Latitude值,但是正如您在xml結構中GeocodePoint節點沒有將其作為屬性,它是一個嵌套元素。 那就是您需要使用Element方法的方式。 第二個問題是您需要考慮名稱空間,如上所示。

您沒有使用名稱空間。 您的Xml提供了命名空間

<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">

因此,在搜索元素時需要使用它。

XDocument doc = XDocument.Load(@"C:\tmp\data.xml");

XNamespace ns = doc.Root.Name.Namespace;
string value = doc.Root.Descendants(ns + "Latitude").FirstOrDefault().Value; 

或在沒有名稱空間的情況下通過元素的LocalName搜索

string value = doc.Root
                  .Descendants
                  .Where(element => element.Name.LocalName.Equals("Latitude"))
                  .FirstOrDefault()
                  .Value;

如果使用Descendats方法,則可以直接搜索所需的元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM