我需要在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=""DataTypeA"" />
<Member Name="AddedDbB" Datatype=""DataTypeB"" />
</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包一起使用
答案 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方法。