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