在我的应用程序中,我正在从一个Web服务转换到另一个Web服务。我得到一个XmlDocument
的XML响应。我正在尝试获取文档中的特定节点。我知道只有一个我正在寻找的节点的实例。之前的实施者能够得到他想要的东西:
XmlNode node = xmlDoc.SelectSingleNode("//result/geometry/location/lat/text()");
我正在尝试对我的回复做同样的事情,但总是得到null。我(含糊地)知道他的XML响应是什么样的,并且知道我的。但我无法使用他的语法。无论怎样,我都会null
。我正在使用更复杂的陈述:
XmlNode xmlNode = xmlDoc.GetElementsByTagName("StatusDescription").Item(0);
但是,正如你所看到的,它很难看。而且 - 更糟糕的是 - 每当我尝试深入多个节点时,我都会回来:
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吗?
答案 0 :(得分:2)
这里的根本区别在于他的 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);