获取XML节点数据

时间:2012-01-25 22:00:01

标签: xml vb.net linq-to-xml

我是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

但是我得到的Object引用未设置为对象的实例。最后一行代码的异常。如果我快速观察位置值,它是正确的节点,但我不知道该做什么......

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 个答案:

答案 0 :(得分:1)

在加载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")

然后您可以在XPath查询中使用“rest:”声明,如下所示:

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

在MSDN上查看此article。它在使用Spatial Data Services搜索POI 部分提及“要使用Bing Maps REST服务使用XPath查询,您必须创建XmlNamespaceManager并添加REST服务数据模式的URL。”

当然如果您在加载文档之前删除xmlns属性,则可以直接访问XML节点,这在我看来更容易:)