2

是否可以使用 javax.xml.bind.* 注释将 xml 前缀→命名空间映射绑定到映射?

就像是:

class FooPOJO {
...
  @Namespacebindingannotation
  Map<String,String> prefixToNamespaceMap;
...
}

在xml中

<foo
  xmlns="http://foo.com"
  xmlns:bar="http://bar.com"
  xmlns:baz="http://baz.com">
...

解组 xml 时,prefixToNamespaceMap会将 3 个前缀映射到它们相应的命名空间。

4

1 回答 1

0

您想从 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 表达式解析成的抽象树中。这是两个完全独立的域。如果在两个域中使用相同的前缀,那完全是巧合。不要构建将前缀从一个域传输到另一个域的应用程序逻辑,因为这势必会中断。

于 2015-01-05T07:52:30.207 回答