使用javax xml绑定注释获取名称空间映射的所有xml前缀

时间:2015-01-05 07:29:15

标签: java xml xml-binding javax.xml

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

类似的东西:

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个前缀映射到其相应的名称空间。

1 个答案:

答案 0 :(得分: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表达式的抽象树中。这是两个完全独立的领域。如果在两个域中使用相同的前缀,那完全是巧合。不要构建将前缀从一个域转移到另一个域的应用程序逻辑,因为这必然会中断。