XPath:选择具有命名空间的特定节点

时间:2016-03-18 10:34:47

标签: xml xpath

我需要在xml文档中选择一个节点,但它上面的节点中有一个名称空间。怎么做?

我的xml文件的一部分:

<SW.DataBlock ID="0">
<AttributeList>
  <DatablockType>SharedDB</DatablockType>
  <Interface>
    <Sections xmlns="http://www.siemens.com/automation/Openness/SW/Interface/v1">
        <Section Name="Static">
            <Member Name="DbBool1" Datatype="Bool" />
            <Member Name="DbA" Datatype="&quot;DataTypeA&quot;" />
            <Member Name="AddedDbB" Datatype="&quot;DataTypeB&quot;" />
        </Section>
    </Sections>
  </Interface>
  <MemoryLayout>Standard</MemoryLayout>
  <Name>DataA</Name>
  <Number>1</Number>
  <ProgrammingLanguage>DB</ProgrammingLanguage>
  <Type>DB</Type>
</AttributeList>
</SW.DataBlock>

这是&#39;部分&#39;我需要得到的节点。由于命名空间,声明:

node2 = node.SelectSingleNode("//Section")

不起作用。我需要代替&#34; //部分&#34;是为了让它发挥作用?

编辑:我将vb.Net与System.Xml包一起使用

1 个答案:

答案 0 :(得分:3)

这取决于您用于处理xpath的软件。使用纯xpath可以做的最好的事情是

//*[local-name()='Section']

这将选择名称为 Section 的所有元素,无论其名称空间如何。

如果在指定的命名空间中需要此元素,则可以执行

//*[local-name()='Section' and namespace-uri()='http://www.siemens.com/automation/Openness/SW/Interface/v1']

许多处理xpath的工具也有注册命名空间的方法,然后你可以使用像

这样的限定形式
//ns:Section

我不熟悉VB或这个包,但看起来你可以使用XmlNamespaceManager类来注册命名空间,然后将它传递给你用作第二个参数的方法。这将允许您使用如图所示的前缀版本。

the documentation中的示例显示了以下如何使用此类的示例。

Dim reader As New XmlTextReader("myfile.xml")
Dim nsmanager As New XmlNamespaceManager(reader.NameTable)
nsmanager.AddNamespace("msbooks", "www.microsoft.com/books")
nsmanager.PushScope()
nsmanager.AddNamespace("msstore", "www.microsoft.com/store")
While reader.Read()
    Console.WriteLine("Reader Prefix:{0}", reader.Prefix)
    Console.WriteLine("XmlNamespaceManager Prefix:{0}",
     nsmanager.LookupPrefix(nsmanager.NameTable.Get(reader.NamespaceURI)))
End While

从示例中获取的关键项是命名空间管理器的创建和命名空间的添加。然后你只需将它传递给SelectSingleNode方法。