JAXB "Неожиданный элемент" ошибка

Я пытаюсь разобрать документ XML. Я генерирую классы, используя XJC.

XSD:

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema version="1.0" elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="Element">
    <xsd:complexType>
      <xsd:sequence>
      ....
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>

XML:

<Element>
....
</Element>

Сгенерированные классы:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    ....
})
public class Element {
   .....
}

@XmlRegistry
public class ObjectFactory {

    public ObjectFactory() {
    }

    public Element createElement() {
        return new Element();
    }
}

Я использую Spring OXM следующим образом:

@Configuration
public class MySpringConfig {

    @Bean
    public Unmarshaller unmarshaller() {
        Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
        // org.example.jaxb2 is the package where the Element and ObjectFactory classes are located
        unmarshaller.setPackagesToScan("org.example.jaxb2");
        return unmarshaller;
    }
}

Затем я использую Unmarshaller следующим образом:

Object obj = unmarshaller.unmarshal(source);

И я получаю следующую ошибку:

org.springframework.oxm.UnmarshallingFailureException: JAXB unmarshalling exception; nested exception is javax.xml.bind.UnmarshalException: unexpected element (URI : "", local : "Element"). Expected elements are (none)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.convertJaxbException(Jaxb2Marshaller.java:884)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:758)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:735)
    at 
......
Caused by: javax.xml.bind.UnmarshalException: unexpected element (URI : "", local : "Element"). Expected elements are (none)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:726)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:109)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1131)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:556)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:538)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:153)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:509)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:380)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:614)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3135)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:880)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:118)
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:140)
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:123)
    at org.springframework.oxm.jaxb.Jaxb2Marshaller.unmarshal(Jaxb2Marshaller.java:754)
    ... 33 more

Я искал в Интернете, но не могу найти ничего полезного. Я знаю, что Element класс не аннотируется @XmlRootElement, но согласно статьям, которые я нашел, XJC работает так - в моем случае это создает ObjectFactory класс вместо.

2 ответа

В вашем xsd отсутствует атрибут targetNamespace. Вы можете увидеть хорошее объяснение этого в XML-схеме: пустое targetNamespace

Попробуйте возможно это:

   public static Element unmarshal(File source) throws JAXBException {
    JAXBContext jaxbContext = JAXBContext.newInstance(Element .class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

    JAXBElement<Element> root = jaxbUnmarshaller.unmarshal(new StreamSource(
            source), Element.class);
    Element el = root.getValue();

    LOGGER.info(el.toString());
    return el;
   }

Для получения дополнительной информации о проблемах от типа:

"неожиданный элемент (uri:"", local:"Element"). Ожидаемые элементы (нет)"

Смотрите эту статью: http://www.source4code.info/2013/07/jaxb-marshal-unmarshal-with-missing.html

Надеюсь это поможет!

Другие вопросы по тегам