您想从 XML 中动态提取名称空间 URI 和前缀吗?这真是个坏主意。
XML 命名空间是应用程序代码与其处理的 XML 之间契约的一部分。它们应该被硬编码到您的应用程序中。
原因很简单。这些 XML 看起来不同,但都是同一个文档:
<foo:root xmlns:foo="http://main/ns" xmlns:bar="http://secondary/ns">
<foo:child bar:attr="1234">some data</foo:child>
</foo:root>
或者
<bar:root xmlns:bar="http://main/ns" xmlns:foo="http://secondary/ns">
<bar:child foo:attr="1234">some data</bar:child>
</bar:root>
或者
<root xmlns="http://main/ns" xmlns:baz="http://secondary/ns">
<child baz:attr="1234">some data</child>
</root>
因此,如果您从它们中动态提取名称空间,您的后续代码将不可避免地(并且不必要地)中断。
在您的代码中使用实际的命名空间 URI 并根据自己的喜好选择前缀 - 前缀是短暂的,它们不必与 XML 文件匹配。XML 是强类型数据,请相应地对待它。
换句话说,命名空间前缀是别名,一种方便的工具,它们只存在于序列化数据中。它们存在于 XML 中,它们不存在于 DOM 中。它们存在于应用程序的 XPath 表达式中,它们不存在于 XPath 表达式解析成的抽象树中。这是两个完全独立的域。如果在两个域中使用相同的前缀,那完全是巧合。不要构建将前缀从一个域传输到另一个域的应用程序逻辑,因为这势必会中断。