2013-12-14 424 views
39

我得到這個錯誤,而解組一個字符串。我已經使用JAXB創建了Java文件。javax.xml.bind.UnmarshalException:意外的元素。預期的元素是(無)

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

堆棧跟蹤:

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> 

輸入字符串:

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

回答

85

當你生成一個XML架構一個JAXB模型,全局元素對應於命名的複雜類型pes將在ObjectFactory類的創建方法中將該元數據捕獲爲@XmlElementDecl註釋。由於您僅在DocumentType類上創建JAXBContext,因此未處理此元數據。如果您從XML模式生成JAXB模型,則應在生成的包名稱或ObjectFactory類上創建JAXBContext,以確保處理所有必需的元數據。

例解:

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

工作正常。 unmarshaller.unmarshal()將返回JAXBElement 而不是DocumentType。調用getValue()來獲取包裝對象。 – rwitzel

+0

在我的情況下,調用導入的根元素需要'unmarshaller = context.createUnmarshaller(); final Object object = unmarshaller.unmarshal(new File(「path/to/data.xml」)); final DocumentType cd =(DocumentType)object;' – CodeMed

+4

第二步看起來像這樣:'DocumentType doc =((JAXBElement )jaxbContext.createUnmarshaller()。unmarshal( inputStream))。getValue();' –

19

或者,如果你想使用DocumentType類持續。 然後您可以在DocumentType類的頂部添加以下注釋。

@XmlRootElement(name="document") 

注意:字符串值"document"引用了xml消息的根標記的名稱。

+0

謝謝,夥計。在尋找解決這種情況的小時後,@XmlRootElement解決了這個問題。我想知道爲什麼這種行爲應該是這樣的。在unmarshalling過程中強制這個註釋真的有意義嗎? – Miere

+0

@Miere現在我想到了。在Web服務的世界中,RPC風格自動提供了一個包裝節點,其中文檔風格的Web服務需要一個明確的聲明。所以,這一直是討論的一個領域。 – bvdb

+0

我在jdk1.6.0_45中使用xjc從XSD生成POJO。由xjc生成的根POJO缺少@XmlRootElement(name =「RootName」)。手動添加此行,並取消編組成功。 – oraclesoon

1

這個錯誤的原因之一是使用jdk中的jaxb實現。我不確定爲什麼這樣的問題會出現在非常簡單的xml解析情況中。您可以使用最新版本的JAXB庫從公共Maven倉庫:

http://mvnrepository.com

<dependency> 
    <groupId>javax.xml.bind</groupId> 
    <artifactId>jaxb-api</artifactId> 
    <version>2.2.12</version> 
</dependency> 
相關問題