使用JAXB将对象编组到xml时,我们遇到了一个问题。在我们的代码示例( https://github.com/fbe/JaxbIssueTracker ,简单的maven项目,测试用例演示出现了什么问题)中,我们有三种类型:
可在此处找到XSD:github
父类型是抽象的,具体扩展父类,父类引用序列中的被劫持类型。从这些xsd文件中,JAVA文件由JAXB(xjc)生成,没有任何警告或错误消息。
当编组具体类型时,JAXB正在生成以下xml-output:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns3:concreteType xmlns:ns2="http://www.felixbecker.name/parent" xmlns="http://www.felixbecker.name/hijacked" xmlns:ns3="http://www.felixbecker.name/concrete">
<ns2:hijacked>
<value>foobar</value>
</ns2:hijacked>
</ns3:concreteType>
正如你所看到的,hijacked-type错误地使用了引用父类型命名空间的ns2-prefix - 而是应该使用引用被劫持命名空间的默认命名空间。
JAXB无法解组此生成的xml,尽管它是由激活的模式验证自行生成的。
这里出了什么问题? xml架构是否已损坏?或者JAXB无法正确处理继承?
从parent.xsd中删除abstract-attribute对面临的问题没有任何影响。
任何帮助都将受到高度赞赏! : - )
已使用的版本(均已损坏):
此致
fbe&amp; ollinux
答案 0 :(得分:0)
在您的示例中,hijacked
元素实际上是在父架构中定义的,因此放在“父”命名空间中。这意味着编组文档的名称空间是正确的。如果jaxb可以解组它自己编组的文档,那么这听起来像是一个bug。
要在正确的命名空间中获取hijacked
元素,您可以将元素声明移动到hijacked
架构并使用
<element ref="hijacked:hijacked"/>
在父模式中。