Получить данные узла XML - PullRequest
0 голосов
/ 26 января 2012

Я новичок в XML и пытаюсь получить некоторую информацию из этого XML-документа: http://pastebin.com/S7eUNmL2

Используя этот код:

    Dim Document As New XmlDocument
    Document.LoadXml(xml)
    Dim DocumentElement As XmlElement = Document.DocumentElement
    Dim ResourceSets As XmlNode = DocumentElement.ChildNodes.ItemOf(6)
    Dim ResourceSet As XmlNode = ResourceSets.ChildNodes(0)
    Dim Resource As XmlNode = ResourceSet.ChildNodes(1)
    Dim LocationList As XmlNodeList = Resource.ChildNodes
    Dim Location As XmlNode = LocationList.ItemOf(0)
    Dim Name As String = Location.SelectSingleNode("Name").Value

Но я получаю ссылку на объект, не установленную для экземпляра объекта. исключение в последней строке кода. Если я быстро посмотрю значение Location, это правильный узел, но я не знаю, что делать ...

XML:

<?xml version="1.0" encoding="utf-8"?>
<Response xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1">
  <Copyright>
    Copyright © 2012 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>e0aabdfcf9f746a39a4f3036b319720c|CPKM001259|02.00.83.500|CPKMSNVM001571, CPKMSNVM001585, CPKMSNVM001584, CPKMSNVM001587, CPKMSNVM001527, CPKMSNVM001502, CPKMSNVM001503</TraceId>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>5</EstimatedTotal>
      <Resources>
        <Location>
          <Name>Perth, Australia</Name>
          <Point>
            <Latitude>-31.953020095825195</Latitude>
            <Longitude>115.85723876953125</Longitude>
          </Point>
          <BoundingBox>
            <SouthLatitude>-32.301349639892578</SouthLatitude>
            <WestLongitude>115.20664978027344</WestLongitude>
            <NorthLatitude>-31.608610153198242</NorthLatitude>
            <EastLongitude>116.52772521972656</EastLongitude>
          </BoundingBox>
          <EntityType>PopulatedPlace</EntityType>
          <Address>
            <AdminDistrict>WA</AdminDistrict>
            <CountryRegion>Australia</CountryRegion>
            <FormattedAddress>Perth, Australia</FormattedAddress>
            <Locality>Perth</Locality>
          </Address>
          <Confidence>High</Confidence>
          <MatchCode>Good</MatchCode>
          <GeocodePoint>
            <Latitude>-31.953020095825195</Latitude>
            <Longitude>115.85723876953125</Longitude>
            <CalculationMethod>Rooftop</CalculationMethod>
            <UsageType>Display</UsageType>
          </GeocodePoint>
        </Location>
        <Location>
          <Name>Perth, Perth and Kinross, United Kingdom</Name>
          <Point>
            <Latitude>56.396049499511719</Latitude>
            <Longitude>-3.4324100017547607</Longitude>
          </Point>
          <BoundingBox>
            <SouthLatitude>56.367079116519164</SouthLatitude>
            <WestLongitude>-3.5021505233751609</WestLongitude>
            <NorthLatitude>56.425019882504273</NorthLatitude>
            <EastLongitude>-3.3626694801343606</EastLongitude>
          </BoundingBox><EntityType>PopulatedPlace</EntityType>
          <Address>
            <AdminDistrict>Scotland</AdminDistrict>
            <AdminDistrict2>Perth and Kinross</AdminDistrict2>
            <CountryRegion>United Kingdom</CountryRegion>
            <FormattedAddress>Perth, Perth and Kinross, United Kingdom</FormattedAddress>
            <Locality>Perth</Locality>
          </Address>
          <Confidence>High</Confidence>
          <MatchCode>Good</MatchCode>
          <GeocodePoint>
            <Latitude>56.396049499511719</Latitude>
            <Longitude>-3.4324100017547607</Longitude>
            <CalculationMethod>Rooftop</CalculationMethod>
            <UsageType>Display</UsageType>
          </GeocodePoint>
        </Location>
      </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>

1 Ответ

1 голос
/ 15 февраля 2012

Удалите объявление пространства имен из узла при загрузке XmlDocument.

Document.LoadXml(xml.Replace("xmlns=""http://schemas.microsoft.com/search/local/ws/rest/v1""",""))

В качестве альтернативы вы можете использовать менеджер пространства имен, например:

Document.LoadXml(xml)
Dim nsmgr As New XmlNamespaceManager(Document.NameTable)
nsmgr.AddNamespace("rest", "http://schemas.microsoft.com/search/local/ws/rest/v1")

Затем вы можете использовать объявление "rest:" в ваших запросах XPath, например:

Dim Name As String = Location.SelectSingleNode("rest:Name", nsmgr).Value

См. статью в MSDN. В разделе Поиск POI с использованием служб пространственных данных упоминается, что «Чтобы использовать запросы XPath со службами REST Bing Maps, необходимо создать XmlNamespaceManager и добавить URL-адрес для схемы данных служб REST». 1014 *

Конечно, если вы просто удалите атрибут xmlns перед загрузкой документа, вы можете просто получить прямой доступ к узлам XML, что, на мой взгляд, проще:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...