2013-12-14 13 views
39

Ricevo questo errore, mentre non eseguo il riarmo di una stringa. Ho creato file Java usando JAXB.javax.xml.bind.UnmarshalException: elemento inaspettato. Gli elementi previsti sono (nessuno)

JAXBContext jaxbContext = JAXBContext.newInstance(DocumentType.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
// Input string posted below 
DocumentType dType = (DocumentType) unmarshaller.unmarshal(new StringReader("input string")); 

traccia stack:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd", local:"document"). Expected elements are (none) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:647) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:243) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:238) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:105) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1048) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:483) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:465) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:135) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:506) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:376) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:602) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3065) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:881) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:489) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:203) 
    at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:175) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214) 
    at JaxbTest.main(JaxbTest.java:19) 

XSD:

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema targetNamespace="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd" 
    elementFormDefault="qualified"> 

    <xs:element name="document" type="tns:documentType"></xs:element> 

    <xs:complexType name="documentType"> 
     <xs:sequence> 
      <xs:element name="businessCard" type="tns:businessCardType" minOccurs="0" maxOccurs="1"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="businessCardType"> 
     <xs:sequence> 
      <xs:element name="field" type="tns:fieldType" minOccurs="0" maxOccurs="unbounded"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="fieldType"> 
     <xs:sequence> 
      <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1"> 
      </xs:element> 
      <xs:element name="characters" type="tns:charactersType" minOccurs="0" maxOccurs="1"></xs:element> 
      <xs:element name="fieldComponents" type="tns:fieldComponentsType" minOccurs="0" maxOccurs="1"></xs:element> 
     </xs:sequence> 
     <xs:attribute name="type" type="tns:typeType"></xs:attribute> 
    </xs:complexType> 

    <xs:simpleType name="typeType"> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="Name"></xs:enumeration> 
      <xs:enumeration value="Phone"></xs:enumeration> 
      <xs:enumeration value="Mobile"></xs:enumeration> 
      <xs:enumeration value="Fax"></xs:enumeration> 
      <xs:enumeration value="Company"></xs:enumeration> 
      <xs:enumeration value="Job"></xs:enumeration> 
      <xs:enumeration value="Address"></xs:enumeration> 
      <xs:enumeration value="Email"></xs:enumeration> 
      <xs:enumeration value="Web"></xs:enumeration> 
      <xs:enumeration value="Text"></xs:enumeration> 
     </xs:restriction> 
    </xs:simpleType> 

    <xs:complexType name="charactersType"> 
     <xs:sequence> 
      <xs:element name="char" type="tns:charType" minOccurs="0" maxOccurs="unbounded"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 

    <xs:complexType name="charType"> 
     <xs:simpleContent> 
      <xs:extension base="xs:string"> 
       <xs:attribute name="suspicious" type="xs:boolean" use="optional"></xs:attribute> 
      </xs:extension> 
     </xs:simpleContent> 
    </xs:complexType> 

    <xs:complexType name="fieldComponentsType"> 
     <xs:sequence> 
     <xs:element name="fieldComponent" type="tns:fieldComponentType" minOccurs="0" maxOccurs="unbounded"></xs:element> 
     </xs:sequence> 
    </xs:complexType> 


    <xs:complexType name="fieldComponentType"> 
     <xs:sequence> 
     <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1"> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="type" type="tns:fieldComponentTypeType"></xs:attribute> 
    </xs:complexType> 

    <xs:simpleType name="fieldComponentTypeType"> 
     <xs:restriction base="xs:string"> 
     <xs:enumeration value="FirstName"></xs:enumeration> 
     <xs:enumeration value="MiddleName"></xs:enumeration> 
     <xs:enumeration value="LastName"></xs:enumeration> 
     <xs:enumeration value="ExtraName"></xs:enumeration> 
     <xs:enumeration value="PhonePrefix"></xs:enumeration> 
     <xs:enumeration value="PhoneCountryCode"></xs:enumeration> 
     <xs:enumeration value="PhoneCode"></xs:enumeration> 
     <xs:enumeration value="PhoneBody"></xs:enumeration> 
     <xs:enumeration value="PhoneExtension"></xs:enumeration> 
     <xs:enumeration value="ZipCode"></xs:enumeration> 
     <xs:enumeration value="Country"></xs:enumeration> 
     <xs:enumeration value="City"></xs:enumeration> 
     <xs:enumeration value="StreetAddress"></xs:enumeration> 
     <xs:enumeration value="JobPosition"></xs:enumeration> 
     <xs:enumeration value="JobDepartment"></xs:enumeration> 
     </xs:restriction> 
    </xs:simpleType> 

</xs:schema> 

stringa di input:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd" xmlns="http://ocrsdk.com/schema/recognizedBusinessCard-1.0.xsd"> 
<businessCard> 
<field type="Phone"> 
    <value>783-37-00</value> 
</field> 
<field type="Phone"> 
    <value>783-37-01</value> 
</field> 
<field type="Fax"> 
    <value>783-26-63</value> 
</field> 
<field type="Email"> 
    <value>[email protected]</value> 
</field> 
<field type="Web"> 
    <value>www.abbyy.com</value> 
</field> 
<field type="Address"> 
    <value>Otradnaya str., 2b, bld.6, 127273, Moscow, Russia</value> 
</field> 
<field type="Name"> 
    <value>John Smith</value> 
</field> 
<field type="Company"> 
    <value>ABBYY Headquarters</value> 
</field> 
<field type="Job"> 
    <value>Product Analyst</value> 
</field> 
<field type="Text"> 
    <value>ABBYY ABBYY Headquarters John Smith Product Analyst ABBYY Headquarters Otradnaya str., 2b, bld.6, 127273, Moscow, Russia Tel: 783-37-00 Fax: 783-26-63 [email protected] www.abbyy.com </value> 
</field> 
</businessCard> 
</document> 

risposta

85

Quando si genera un modello di JAXB da uno schema XML, elementi globali che corrispondono a nome complesso ty pes avrà quei metadati catturati come annotazione @XmlElementDecl su un metodo di creazione nella classe ObjectFactory. Poiché stai creando JAXBContext solo sulla classe DocumentType, questi metadati non vengono elaborati. Se il modello JAXB è stato generato da uno schema XML, è necessario creare lo JAXBContext sul nome del pacchetto generato o sulla classe ObjectFactory per garantire che tutti i metadati necessari vengano elaborati.

soluzione Esempio:

JAXBContext jaxbContext = JAXBContext.newInstance(my.generatedschema.dir.ObjectFactory.class); 
DocumentType documentType = ((JAXBElement<DocumentType>) jaxbContext.createUnmarshaller().unmarshal(inputStream)).getValue(); 
+6

funziona bene. unmarshaller.unmarshal() restituirà JAXBElement invece di DocumentType. Chiama getValue() per ottenere l'oggetto spostato. – rwitzel

+0

Nel mio caso, chiamare l'elemento radice importato richiesto 'unmarshaller = context.createUnmarshaller(); finale Oggetto object = unmarshaller.unmarshal (nuovo file ("percorso/a/data.xml")); finale DocumentType cd = (DocumentType) oggetto; ' – CodeMed

+4

Secondo passo è simile al seguente:.' DocumentType doc = (. (JAXBElement ) jaxbContext.createUnmarshaller() unmarshal ( inputStream)) getValue(); ' –

19

In alternativa, se si vuole persistere nel utilizzando la classe DocumentType. Quindi è possibile aggiungere la seguente annotazione sulla classe DocumentType.

@XmlRootElement(name="document") 

Nota: il valore String "document" si riferisce al nome del tag radice del messaggio XML.

+0

Grazie, amico. Dopo aver cercato ore per una soluzione in questa situazione, @XmlRootElement ha risolto il problema. Mi chiedo perché questo comportamento dovrebbe essere così. Ha davvero senso forzare questa annotazione in un processo di smantellamento? – Miere

+0

@Miere Ora che ci penso. Nel mondo dei servizi Web, lo stile RPC fornisce automaticamente un nodo wrapping, in cui i servizi Web in stile documento richiedono una dichiarazione esplicita. Quindi, è sempre stata un'area di discussione. – bvdb

+0

Sto usando xjc in jdk1.6.0_45 per generare POJO da XSD. Manca il root POJO generato da xjc @XmlRootElement (name = "RootName").Aggiungi questa linea in cima manualmente e unmarshal ha successo. – oraclesoon

1

Uno dei motivi di questo errore è l'utilizzo dell'implementazione jaxb da jdk. Non sono sicuro del motivo per cui un simile problema possa apparire in semplici situazioni di analisi di xml. È possibile utilizzare la versione più recente della libreria JAXB da un repository Maven pubblico:

http://mvnrepository.com

<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api</artifactId> 
    <version>2.2.12</version> 
</dependency> 
Problemi correlati