2013-12-14 19 views
39

Bu hatayı alıyorum, bir dizeyi unmarshalling. JAXB kullanarak Java dosyaları oluşturdum.javax.xml.bind.UnmarshalException: beklenmeyen öğe. Beklenen öğeler (hiçbiri)

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

Yığın izleme:

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> 

Giriş dizesi:

<?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> 

cevap

85

bir XML Şeması bir JAXB bir model oluşturmak, küresel elemanlar o adlandırılmış karmaşık ty karşılık pes, ObjectFactory sınıfındaki bir oluşturma yönteminde @XmlElementDecl ek notu olarak yakalanan meta verilere sahip olacaktır. DocumentType sınıfında JAXBContext'u oluşturduğunuz için, bu meta veriler işlenmiyor. JAXB modelinizi bir XML Şeması'ndan oluşturduysanız, gerekli tüm meta verilerin işlendiğinden emin olmak için oluşturulan paket adı veya ObjectFactory sınıfında JAXBContext'u oluşturmalısınız.

Örnek çözümü: Alternatif

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

İşleri cezası. unmarshaller.unmarshal() DocumentType yerine JAXBElement 'i döndürecektir. Sarılmış nesneyi almak için getValue() öğesini çağırın. – rwitzel

+0

Durumumda, içe aktarılan root öğesini çağırmak gerekiyor 'unmarshaller = context.createUnmarshaller(); final Nesne nesnesi = unmarshaller.unmarshal (yeni dosya ("yol/to/data.xml")); ; son DocumentType cd = (DocumentType) nesnesi ' – CodeMed

+4

İkinci adım şuna benzer:.' DocumentType doc = (. (JAXBElement ) jaxbContext.createUnmarshaller() unmarshal ( inputStream)) getValue(); ' –

19

Eğer DocumentType sınıfını kullanarak ısrar etmek istiyorum. Sonra, aşağıdaki notu DocumentType sınıfınızın üstüne ekleyebilirsiniz.

@XmlRootElement(name="document") 

Not: String değeri "document" xml mesajın kök etiketinin adını belirtir.

+0

Teşekkürler, ahbap. Bu durumda bir çözüm için saatlerce avlandıktan sonra, @XmlRootElement sorunu giderdi. Bu davranışın neden böyle olması gerektiğini merak ediyorum. Bu notu unmarshalling süreci altında zorlamak gerçekten mantıklı mı? – Miere

+0

@Miere Şimdi bunun hakkında düşünüyorum. Web servislerinin dünyasında, RPC stili otomatik olarak, belge tarzı web servislerinin açık bir beyan gerektirdiği bir sarma düğümü sağlar. Yani, her zaman bir tartışma alanı olmuştur. – bvdb

+0

XSD'den POJO oluşturmak için jdk1.6.0_45'te xjc kullanıyorum. Xjc tarafından üretilen kök POJO @XmlRootElement (name = "RootName") eksik.Bu satırı el ile üstüne ekleyin ve unmarshal başarılı. – oraclesoon

1

Bu hatanın nedenlerinden biri, jdk uygulamasının jaxb uygulamasının kullanılmasıdır. Böyle bir sorunun neden oldukça basit xml ayrıştırma durumlarında görünebileceğinden emin değilim. Bir kamu maven deposundan JAXB kütüphanesinin son sürümünü kullanabilir:

http://mvnrepository.com

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