使用默认命名空间时,无法解组编组的文档

Chr*_*ian 5 java xml jaxb eclipselink

我设置了一个显示我的问题的回购: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>
Run Code Online (Sandbox Code Playgroud)

这是我从以下代码获得的文档:

    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);
Run Code Online (Sandbox Code Playgroud)

文件如下:

@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;

}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

当我尝试解组时,我没有得到数据映射:

    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();
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我正在使用eclipselink moxy.

我需要更改什么,以便解组已编组的文档.

Nán*_*ete 4

我认为每当 JAXB 中发生类似这样的奇怪事情时,查看映射的实际 XSD 模式总是一个好主意。您可以使用以下代码轻松做到这一点。

\n\n
JAXBContext jaxbContext = JAXBContext.newInstance(Document.class);\njaxbContext.generateSchema(new SchemaOutputResolver() {\n\n    @Override\n    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {\n        StreamResult streamResult = new StreamResult(new PrintWriter(System.err) {\n            @Override\n            public void close() {\n            }\n        });\n        streamResult.setSystemId(suggestedFileName);\n        return streamResult;\n    }\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将打印应反映您的 JAXB 模型的模式(您可以使用其他编写器将它们写入文件)。XSD 文件通常非常能揭示此类问题。我认为你的情况的问题是映射@XmlSchema。你应该尝试使用elementFormDefault\xc2\xa0=\xc2\xa0XmlNsForm.QUALIFIED。使用总是一个好主意QUALIFIED每当您在映射中使用多个命名空间时,

\n\n

编辑:虽然 JAXB 映射的主要问题是错误和/或缺失值elementFormDefault修复其他问题才能使存储库中的代码正常工作。

\n\n
    \n
  • Export中的元素缺少Document名称空间声明(从您的示例中,DocumentExport元素是不同名称空间的一部分)
  • \n
  • 包裹elementFormDefault\xc2\xa0=\xc2\xa0XmlNsForm.QUALIFIED中缺失export
  • \n
  • 主包@XmlSchema注释的命名空间值错误(而urn:stackoverflow:exportnamespace不是元素应该urn:stackoverflow:documentnamespace在的位置)Document
  • \n
  • 错误的导入jdk_jaxb/UnmarshallerTest.java- 它正在导入 themodel.eclipselink.Document而不是model.sun.Document
  • \n
\n