我有一个XML文件,启动如下: Elements name="Entities" xmlns="XS-GenerationToolElements" 我必须打开很多这些文件。每一个都有不同的命名空间,但一次只有一个命名空间(我永远不会找到两个命名空
<Elements name="Entities" xmlns="XS-GenerationToolElements">
我必须打开很多这些文件。每一个都有不同的命名空间,但一次只有一个命名空间(我永远不会找到两个命名空间定义在一个XML文件)。
使用XPath我想有一个自动的方式来添加给命名空间管理器的命名空间。
到目前为止,我只能通过解析xml文件获取命名空间,但我有一个XPathNavigator实例,它应该有一个很好的和干净的方式来获取命名空间,对吧?
– 要么 –
鉴于我只有一个命名空间,不知何故使XPath使用存在于xml中的唯一一个,从而避免通过总是附加命名空间使代码混乱。
有一些技术,你可以尝试;你使用的将取决于你需要什么信息,你需要退出的文档,你想要多严谨,以及你使用的XPath实现是否符合。获取与特定前缀相关联的命名空间URI的一种方法是使用namespace :: axis。这将给你一个命名空间节点,其名称是前缀,其值是命名空间URI。例如,您可以使用以下路径获取文档元素上的默认命名空间URI:
/*/namespace::*[name()='']
您可以使用它为您的XPathNavigator设置命名空间关联。但要注意,namespace :: axis是XPath 1.0的那些不总是被实现的角落之一。
获得该命名空间URI的第二种方法是在文档元素上使用namespace-uri()函数(你已经说过,它将始终在该命名空间中)。表达方式:
namespace-uri(/*)
将给你的命名空间。
另一种方法是忘记将一个前缀与该命名空间相关联,并且只是使你的路径没有命名空间。你可以通过使用local-name()函数,每当你需要引用一个元素的命名空间,你不知道。例如:
//*[local-name() = 'Element']
你可以进一步,测试元素的命名空间URI对文档元素之一,如果你真的想要:
//*[local-name() = 'Element' and namespace-uri() = namespace-uri(/*)]
最后一个选项,考虑到命名空间似乎对你来说没什么意义,将通过一个过滤器来运行你的XML,删除命名空间。然后你不必在你的XPath中担心他们。最简单的方法是简单地用正则表达式删除xmlns属性,但如果你需要同时做其他整理,你可以做一些更复杂的事情。