首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用xPath从名称空间的xml中检索特定元素

如何使用xPath从名称空间的xml中检索特定元素
EN

Stack Overflow用户
提问于 2013-03-14 23:15:19
回答 1查看 274关注 0票数 1

我有一个关于从名称空间xml中检索节点的问题。只要在查询中指定xml的单个元素,就可以检索所有匹配的元素,并且可以遍历它们的子元素。当我试图通过指定更详细的查询来检索一个唯一的元素时,我的问题就出现了。

我用来测试的XML文件

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<<MTConnectStreams xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:mtconnect.org:MTConnectStreams:1.2 http://mtconnect.org/schemas/MTConnectStreams_1.2.xsd" xmlns="urn:mtconnect.org:MTConnectStreams:1.2">
  <Streams>
    <Samples>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="x_pos_cmd" subType="COMMANDED" units="MILLIMETER">1</Position>
      <Position dataItemId="xs5" timestamp="2012-11-29T12:30:19Z" sequence="1718270" name="x_pos_act" subType="ACTUAL" units="MILLIMETER">2</Position>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="y_pos_cmd" subType="COMMANDED" units="MILLIMETER">3</Position>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="y_pos_act" subType="COMMANDED" units="MILLIMETER">4</Position>
      <Position dataItemId="xs4" timestamp="2012-11-29T12:30:19Z" sequence="1718269" name="z_pos_cmd" subType="COMMANDED" units="MILLIMETER">5</Position>
    </Samples>
    <Condition>
      <Unavailable dataItemId="xc1" type="POSITION" timestamp="2012-11-27T23:19:40Z" sequence="7" name="x_cond_pos">UNAVAILABLE</Unavailable>
      <Unavailable dataItemId="xc2" type="LOAD" timestamp="2012-11-27T23:19:40Z" sequence="8" name="x_cond_load">UNAVAILABLE</Unavailable>
    </Condition>
  </Streams>
</MTConnectStreams>

给定以下代码:

代码语言:javascript
复制
Dim xIt As XPathNodeIterator
Dim xDoc As XmlDocument = New XmlDocument
xDoc.Load("c:\Download\Test.xml")
Dim xNav As XPathNavigator = xDoc.CreateNavigator
Dim nsMgr = New XmlNamespaceManager(xNav.NameTable)
nsMgr.AddNamespace("ns", "urn:mtconnect.org:MTConnectStreams:1.2")

sQuery = "//ns:Samples"
xIt = xNav.Select(sQuery, nsMgr)
MsgBox(xIt.Count.ToString)

When sQuery = "//ns:Samples" (1 result)
When sQuery = "//ns:Position" (5 results)
When sQuery = "//ns:Samples/Position (0 results  why?)
When sQuery = "//ns:Samples/Position[@name='x_pos_act'] (0 results)
When sQuery = "//ns:Position[@name='x_pos_act']" (0 results)
When sQuery = "//ns:Position/[@name='x_pos_act']" (0 results)

当查询超过一个节点名时,我得不到任何结果。我不知道如何指定更详细的查询。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-14 23:20:57

它应该可以使用//ns:Samples/ns:Position工作

在XPath中,您必须在每个子部分中指定名称空间前缀。这也适用于属性!

所以试试吧:

代码语言:javascript
复制
When sQuery = "//ns:Samples"
When sQuery = "//ns:Position"
When sQuery = "//ns:Samples/ns:Position
When sQuery = "//ns:Samples/ns:Position[@ns:name='x_pos_act']
When sQuery = "//ns:Position[@ns:name='x_pos_act']"
When sQuery = "//ns:Position/[@ns:name='x_pos_act']"

如果不想考虑名称空间,也可以使用@*[local-name()='Samples']语法。这将忽略所有名称空间,并且只检查节点名称本身。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15413115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档