Get XML Node Data

南楼画角 提交于 2019-12-12 03:14:31

问题


I am new to XML and am trying to get some of the information from this XML document: http://pastebin.com/S7eUNmL2

Using this code:

    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

But I get an Object reference not set to an instance of an object. exception on the last line of code. If I quickwatch the Location value it is the correct node, but I'm at a loss of what to do...

The 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:


Remove the namespace declaration from the node when you load the XmlDocument.

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

Alternatively you could use a namespace manager like this:

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

Then you can use the "rest:" declaration in your XPath queries like this:

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

See this article on MSDN. It mentions under the section Searching for POI using the Spatial Data Services that "To use XPath queries with the Bing Maps REST Services, you must create an XmlNamespaceManager and add the URL for the REST Services data schema."

Course if you just remove the xmlns attribute before loading the doc you can just access the XML nodes directly, which is easier in my opinion :)



来源:https://stackoverflow.com/questions/9010974/get-xml-node-data

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!