gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:46:27 25 4
gpt4 key购买 nike

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

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

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

因此,当我去解码示例集时,具有指定前缀(上面示例中的“存储库”)的 QName 属性为 NULL!因此,看起来 JAXB 正在“丢弃”那些具有未定义 namespace 前缀的属性 QName 值。令我惊讶的是它甚至没有保留本地名称。

理想情况下,我想保持该值不变,但看起来我无法在绑定(bind)时将 QName 映射到字符串(架构到 Java)。

我尝试“手动”将 namespace 定义插入到 XML 中,效果非常好。执行此操作最简单的方法是什么?

有没有办法在运行时“插入” namespace 映射/定义?或者在绑定(bind)时“全局”定义它?

最佳答案

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

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

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

我个人会实现一个 SAX/StAX 过滤器来在事件级别“预处理”您的 XML。

关于java - 缺少命名空间定义的 JAXB 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25560774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com