用简洁的语法解析 XML

Posted

技术标签:

【中文标题】用简洁的语法解析 XML【英文标题】:Parse XML with succint syntax 【发布时间】:2015-10-16 01:21:27 【问题描述】:

在我的应用程序中,我正在从一种 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 响应的 sn-p:

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

这是我的一个sn-p:

<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 吗?

【问题讨论】:

你试过明显的XmlNode node = xmlDoc.SelectSingleNode("//StatusDescription/text()");XmlNode node = xmlDoc.SelectSingleNode("/ResourceSets/ResourceSet/");吗? 【参考方案1】:

这里的根本区别在于 his XML 没有默认命名空间,而 yours 在这里声明了默认命名空间:

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);

【讨论】:

谢谢,har07。成功了!我确实先搜索了答案,但没有找到。我想我不知道要搜索什么。 ://

以上是关于用简洁的语法解析 XML的主要内容,如果未能解决你的问题,请参考以下文章

用于 php 的独立语法和解析器

Python-Json字符串和XML解析

Java学习总结(21)——XML文档解析:DOM解析,SAX解析

Uuit12:XML语法XML解析

swupdate文档 四SWUpdate:使用默认解析器的语法和标记

JAVASE02-Unit012: Unit07: XML语法 XML解析