我设置了一个显示我的问题的回购:https://github.com/Waxolunist/stackoverflow.34392476
我尝试解组一个简单的xml文档:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx">
<Export xmlns="urn:adcubum:Syrius">
<ExportInhalt/>
<ExportKopf>
<Quelle>lokal</Quelle>
</ExportKopf>
<SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion>
</Export>
</for:document>
这是我从以下代码获得的文档:
Document document = new Document();
Export export = new Export();
ExportKopf exportKopf = new ExportKopf();
exportKopf.setQuelle("lokal");
export.setExportKopf(exportKopf);
ExportInhalt exportInhalt = new ExportInhalt();
export.setExportInhalt(exportInhalt);
export.setSchemaVersion("bec811a9807a8c8da403d70b9b5e22ad");
document.setExport(export);
JAXBContext jaxbContext = JAXBContext.newInstance(Document.class);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(document, System.out);
文件如下:
@XmlAccessorType(XmlAccesstype.FIELD)
@XmlRootElement(name = "document", namespace = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx")
public class Document {
@XmlElement(name = "Export", namespace = "urn:adcubum:Syrius")
private vo.dom.common_service.modul_bl.syrius.Export export;
}
package-info.java
@XmlSchema(
namespace = "urn:adcubum:Syrius",
xmlns = {
@XmlNs(prefix = "for", namespaceURI = "http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx"),
@XmlNs(prefix = "", namespaceURI = "urn:adcubum:Syrius")
},
elementFormDefault = XmlNsForm.UNQUALIFIED)
当我尝试解组时,我没有得到数据映射:
JAXBContext jaxbContext = JAXBContext.newInstance(Document.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
InputStream is = this.getClass().getResourceAsstream("/requests/document_simple3.xml");
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLStreamReader xmlsr = factory.createXMLStreamReader(is);
Document document = unmarshaller.unmarshal(xmlsr, Document.class).getValue();
ExportKopf和ExportInhalt返回null.
而是跟随xml工作.唯一的区别是名称空间前缀:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<for:document xmlns:for="http://www.adcubum.com/wsdl/global/callout/syrius/modul_bl/doc/service/documentrenderer/forwktbx">
<ns3:Export xmlns:ns3="urn:adcubum:Syrius">
<ExportInhalt/>
<ExportKopf>
<Quelle>lokal</Quelle>
</ExportKopf>
<SchemaVersion>bec811a9807a8c8da403d70b9b5e22ad</SchemaVersion>
</ns3:Export>
</for:document>
我正在使用eclipselink moxy.
我需要更改什么,以便解组已编组的文档.
解决方法:
我认为,在JAXB中发生类似奇怪的事情的时候,看到映射的实际XSD架构总是一个好主意.您可以使用以下代码轻松完成此操作.
JAXBContext jaxbContext = JAXBContext.newInstance(Document.class);
jaxbContext.generateSchema(new SchemaOutputResolver() {
@Override
public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
StreamResult streamResult = new StreamResult(new PrintWriter(System.err) {
@Override
public void close() {
}
});
streamResult.setSystemId(suggestedFileName);
return streamResult;
}
});
这将打印应该反映您的JAXB模型的模式(您可以使用另一个编写器将它们写入文件). XSD文件通常对这类问题非常透露.我认为你的案例中的问题是@XmlSchema映射.您应该尝试使用elementFormDefault = XmlNsForm.QUALIFIED.每当您在映射中使用多个名称空间时,使用QUALIFIED总是一个好主意.
编辑:虽然您的JAXB映射的主要问题是elementFormDefault的错误和/或缺失值,但还有其他一些事情需要修复才能使您的仓库中的代码正常工作.
> Document中的Export元素缺少名称空间声明(从您的示例中,Document和Export元素是不同名称空间的一部分)
>从导出包中缺少elementFormDefault = XmlNsForm.QUALIFIED
>主包@XmlSchema注释的命名空间值错误(是urn:stackoverflow:exportnamespace而不是urn:stackoverflow:documentnamespace,其中应该是Document元素)
> jdk_jaxb / UnmarshallerTest.java导入错误 – 导入了model.eclipselink.Document而不是model.sun.Document