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



所以我四处寻找这个特定问题的解决方案,希望有人能给我指明一个好的方向。

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

例如,一个XML属性值是"repository:<uuid>",但数据集中从未定义名称空间前缀"repository"。(不要介意提供商的最佳实践建议定义它!)

因此,当我去解组一个样本集时,具有指定前缀的QName属性(上面的样本中的"repository")为NULL!因此,看起来JAXB正在"抛出"那些具有未定义名称空间前缀的属性QName值。我感到惊讶的是,它甚至没有保留当地的名字。

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

我尝试过"手动"将名称空间定义插入到XML中,它的工作方式非常有魅力。做这件事最不复杂的方法是什么?

有没有一种方法可以在运行时"插入"命名空间映射/定义?或者在绑定时将其定义为"全局"?

最简单的方法是使用字符串而不是QName。您可以使用javaType自定义来实现这一点。

如果你想在运行时添加前缀/命名空间映射,有很多方法可以做到:

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

我个人会实现SAX/StAX过滤器,以便在事件级别上"预处理"XML。

最新更新