用简洁的语法解析XML

本文关键字:XML 语法 简洁 | 更新日期: 2023-09-27 18:18:06

在我的应用程序中,我正在从一个web服务转换到另一个web服务。我得到一个作为XmlDocument的XML响应。我试图在文档中获得特定的节点。我知道我要找的节点永远只有一个实例。以前的实现者可以通过以下方式得到他想要的:

XmlNode node = xmlDoc.SelectSingleNode("//result/geometry/location/lat/text()");

我正试图对我的响应做同样的事情,但总是得到null返回。我(模糊地)知道他的XML响应是什么样子,也知道我的。但我不会用他的语法。我得到null。我用了一个更复杂的语句:

XmlNode xmlNode = xmlDoc.GetElementsByTagName("StatusDescription").Item(0);

但是,正如你所看到的,它很丑。更糟糕的是,每当我尝试深度超过一个节点时,我都会返回null:

XmlNode xmlNode = xmlDoc.GetElementsByTagName("/ResourceSets/ResourceSet").Item(0);

我试过在几个地方插入和删除斜杠,但无济于事。前一个实现者得到的XML没有什么特别的;它只是XML。但他可以跳得很轻松。

下面是他的XML响应的一个片段:

<GeocodeResponse>
 <status>OK</status>
 <result>
  <geometry>
   <location>
    <lat>37.4217550</lat>
    <lng>-122.0846330</lng>
   </location>
  </geometry>
 </result>
</GeocodeResponse>

这是我的一个片段:

<Response xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
        <Resources>
          <Location>
              ...
          </Location>
        </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>

你知道我怎样才能像他一样简单地遍历XML吗?

用简洁的语法解析XML

这里最根本的区别是他的 XML没有默认的名称空间,而你的在这里声明了默认的名称空间:

xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1"
顺便说一下,这个主题(使用默认名称空间对XML进行XPath查询)以前在SO中以各种形式被多次问到。注意,声明默认名称空间的元素及其所有没有前缀和没有不同的默认名称空间声明的后代都被认为是在前面提到的默认名称空间中。查询名称空间中的元素的一种可能方法是使用名称空间管理器将前缀映射到名称空间uri,然后在XPath中正确使用映射的前缀,例如:
var nsManager As New XmlNamespaceManager(new NameTable());
nsManager.AddNamespace("d", "http://schemas.microsoft.com/search/local/ws/rest/v1");
XmlNode xmlNode = xmlDoc.SelectSingleNode("//d:StatusDescription", nsManager);