我正在尝试将 java 模型映射到某些 XML 中。为此,我使用 JAXB 的 MOXy 实现。我在从 java 模型生成有效的 XML 模式时遇到了一些麻烦。我使用以下模型:
@XmlRootElement
public class FooBar {
@XmlAttribute
@XmlPath("test/@foo")
private boolean foo;
}
我使用以下代码生成架构:
public static void main(String[] args) throws Exception {
final SchemaOutputResolver sor = new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceUri,
String suggestedFileName) throws IOException {
return new StreamResult(System.out);
}
};
JAXBContext jc = JAXBContext.newInstance(FooBar.class);
jc.generateSchema(sor);
}
我使用以下 package-info.java 文件:
@XmlSchema(namespace = "http://moxy.test", elementFormDefault = XmlNsForm.QUALIFIED)
package test.moxy;
import javax.xml.bind.annotation.XmlNsForm;
import javax.xml.bind.annotation.XmlSchema;
运行测试时,我获得以下架构:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:ns0="http://moxy.test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://moxy.test" elementFormDefault="qualified">
<xsd:complexType name="big">
<xsd:sequence>
<xsd:element name="test" minOccurs="0">
<xsd:complexType>
<xsd:sequence/>
<xsd:attribute ref="ns0:foo"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="big" type="ns0:big"/>
<xsd:attribute name="foo" type="xsd:boolean" use="required"/>
</xsd:schema>
可以看出,最后一个属性元素并不是人们所期望的。如果我删除 package-info.java 文件,则会生成以下架构:
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name="fooBar">
<xsd:sequence>
<xsd:element name="test" minOccurs="0">
<xsd:complexType>
<xsd:sequence/>
<xsd:attribute name="foo" type="xsd:boolean" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
<xsd:element name="fooBar" type="fooBar"/>
</xsd:schema>
这就是我期望生成的内容。有谁知道为什么会这样吗?
最佳答案
更新
此问题 ( https://bugs.eclipse.org/354130 ) 现已在我们的 EclipseLink 2.3.1 和 2.4.0 流中得到修复,并将于 2011 年 8 月 9 日起从我们的夜间下载网站提供:
关于java - 使用 @XmlPath 和命名空间时从 MOXy JAXB 生成的 XML 架构出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6976034/