2015-12-29 11 views
0

Я пытаюсь развернуть XML-документ. Я генерирую классы с помощью XJC.Ошибка JAXB "Неожиданный элемент"

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 ОХМ следующим образом:

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

ответ

0

Попробуйте, может быть, это:

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:"», местный: . "Элемент") Ожидаемые элементы (нет) "

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

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