Java UnmarshaleException:意外元素(uri:";http://www.namespace.com/RTS",本地:“集装箱”

Java UnmarshaleException:意外元素(uri:";http://www.namespace.com/RTS",本地:“集装箱”,java,xml,jaxb,mapping,Java,Xml,Jaxb,Mapping,我正在尝试将xml映射到java类。 Xml来自第三方服务。结构相同,但可能有不同的前缀或命名空间。XML: <?xml version="1.0" encoding="UTF-8"?> <xdms:container xmlns:xdms="http://www.namespace.com/RTS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xdms:uid="FHGHDFGDFJKGDFHG" xdms:ve

我正在尝试将xml映射到java类。 Xml来自第三方服务。结构相同,但可能有不同的前缀或命名空间。XML:

<?xml version="1.0" encoding="UTF-8"?>
<xdms:container xmlns:xdms="http://www.namespace.com/RTS" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xdms:uid="FHGHDFGDFJKGDFHG" xdms:version="3.2">
    <xdms:requisites>
        <xdms:documentKind>letter</xdms:documentKind>
        <xdms:classification>main</xdms:classification>
        <xdms:annotation>unknown</xdms:annotation>
    </xdms:requisites>
</>
以及我在其中运行解析的主类:

    JAXBContext jaxbContext;
    File xmlFile = new File("test.xml");
    try
    {
        jaxbContext = JAXBContext.newInstance(Container.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        Container cont = (Container) jaxbUnmarshaller.unmarshal(xmlFile);

        System.out.println(cont);
    }
    catch (JAXBException e)
    {
        e.printStackTrace();
    }
我得到了一个错误:

javax.xml.bind.UnmarshaleException:意外元素 (uri:,本地:“容器”)。预期 元素是,在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.\u startElement(UnmarshallingContext.java:556) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538) 在 com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:374) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:613) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3132) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:852)

UPD:
我添加了名称空间,错误消失了。但是我的对象的字段中没有填充信息。它们是空的,尽管在xml中它们充满了信息

容器{requisites=requisites{documentKind='null', classification='null',annotation='null'}


您没有在jaxb类中指定名称空间

诸如此类:

@XmlRootElement(name = "container", namespace = "http://www.namespace.com/RTS")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container {

    @XmlElement(name = "requisites", namespace="http://www.namespace.com/RTS")
    private Requisites requisites;

}
您可能还需要向
Requisites
中的每个元素添加名称空间

@XmlRootElement(name = "requisites")
@XmlAccessorType(XmlAccessType.FIELD)
public class Requisites implements Serializable {
    private static final long serialVersionUID = 1L;

    @XmlElement(name = "documentKind", namespace="http://www.namespace.com/RTS")
    private String documentKind;
    @XmlElement(name = "classification", namespace="http://www.namespace.com/RTS")
    private String classification;
    @XmlElement(name = "annotation", namespace="http://www.namespace.com/RTS")
    private String annotation;

您没有在jaxb类中指定名称空间

诸如此类:

@XmlRootElement(name = "container", namespace = "http://www.namespace.com/RTS")
@XmlAccessorType(XmlAccessType.FIELD)
public class Container {

    @XmlElement(name = "requisites", namespace="http://www.namespace.com/RTS")
    private Requisites requisites;

}
您可能还需要向
Requisites
中的每个元素添加名称空间

@XmlRootElement(name = "requisites")
@XmlAccessorType(XmlAccessType.FIELD)
public class Requisites implements Serializable {
    private static final long serialVersionUID = 1L;

    @XmlElement(name = "documentKind", namespace="http://www.namespace.com/RTS")
    private String documentKind;
    @XmlElement(name = "classification", namespace="http://www.namespace.com/RTS")
    private String classification;
    @XmlElement(name = "annotation", namespace="http://www.namespace.com/RTS")
    private String annotation;

在@XmlRootElement中使用namespace属性,如下所示:

@XmlRootElement(name="container", namespace="http://www.namespace.com/RTS")
在这种情况下,如果它仍然抛出相同的错误,您还必须在@XmlElement中指定名称空间属性:

@XmlElement(name="requisites", namespace="http://www.namespace.com/RTS")

Requisites标记中的每个属性也应该包含@XmlElement注释中的名称空间。

在@XmlRootElement中使用名称空间属性,如下所示:

@XmlRootElement(name="container", namespace="http://www.namespace.com/RTS")
在这种情况下,如果它仍然抛出相同的错误,您还必须在@XmlElement中指定名称空间属性:

@XmlElement(name="requisites", namespace="http://www.namespace.com/RTS")

Requisites标记中的每个属性也应该包含@XmlElement注释中的名称空间。

我添加了名称空间,错误消失了。但是我的对象的字段中没有填充信息。它们是空的,尽管在xml中它们充满了信息
Container{requisites=requisites{documentKind='null',classification='null',annotation='null'}
@maksim2112也将名称空间添加到requisites的元素中。我更新了我的答案,添加了名称空间,错误消失了。但是我的对象的字段中没有填充信息。它们是空的,尽管在xml中它们充满了信息
Container{requisites=requisites{documentKind='null',classification='null',annotation='null'}
@maksim2112也将名称空间添加到requisites的元素中。我更新了我的答案