gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:29:12 25 4
gpt4 key购买 nike

我需要在 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>

这是我需要获取的“部分”节点。由于命名空间,语句:

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

不起作用。我需要用什么来代替“//Section”部分才能使其正常工作?

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

最佳答案

这取决于您用来处理 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 方法。

关于xml - XPath:选择具有命名空间的特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36082094/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com