所以我搜索了一下这个特定问题的解决方案,我希望有人可以指出我的方向。
我们以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;在约束时间?
答案 0 :(得分:2)
最简单的方法是使用字符串而不是QName。您可以使用javaType
自定义to achieve this。
如果要在运行时添加前缀/命名空间映射,有很多方法可以实现:
startDocument
中声明其他前缀。UnmarshallingContext.environmentNamespaceContext
。我已经检查了源代码,但找不到直接而简单的方法。我个人会实现一个SAX / StAX过滤器来预处理&#34;您在事件级别上的XML。