缺少命名空间定义的JAXB问题

时间:2014-08-29 02:21:23

标签: java xml jaxb xsd xml-namespaces

所以我搜索了一下这个特定问题的解决方案,我希望有人可以指出我的方向。

我们以XML格式接收数据,我们只有XSD来验证数据。所以我使用JAXB生成Java类。当我去解组一个示例XML时,我发现缺少一些属性值。事实证明,模式期望这些属性是QName,但数据提供者没有在XML中定义前缀。

例如,一个XML属性值是"repository:<uuid>",但是名称空间前缀&#34; repository&#34;永远不会在数据集中定义。 (不要紧,提供商的最佳实践建议定义它!)

因此,当我去解组样本集时,带有指定前缀的QName属性(&#34;存储库&#34;在我上面的示例中)为NULL!所以看起来JAXB是&#34;扔掉&#34;这些属性具有未定义的名称空间前缀的QName值。我很惊讶它甚至不保留本地名称。

理想情况下,我希望保持该值不变,但看起来我无法在绑定时将QName映射到String(Schema to Java)。

我试过&#34;手动&#34;将命名空间定义插入XML,它就像一个魅力。这样做最简单的方法是什么?

有没有办法去&#34;插入&#34;运行时命名空间映射/定义?或者定义它&#34;全球&#34;在约束时间?

1 个答案:

答案 0 :(得分:2)

最简单的方法是使用字符串而不是QName。您可以使用javaType自定义to achieve this

如果要在运行时添加前缀/命名空间映射,有很多方法可以实现:

  • 与上面类似,您可以提供自己的QName转换器,它会考虑您的前缀。
  • 您可以在其间放置SAX或StAX过滤器,并在startDocument中声明其他前缀。
  • 您实际需要的是将前缀映射添加到UnmarshallingContext.environmentNamespaceContext。我已经检查了源代码,但找不到直接而简单的方法。

我个人会实现一个SAX / StAX过滤器来预处理&#34;您在事件级别上的XML。

相关问题