web-dev-qa-db-fra.com

javax.xml.bind.UnmarshalException: élément inattendu. Les éléments attendus sont (aucun)

J'obtiens cette erreur en déformant une chaîne. J'ai créé des fichiers Java avec JAXB.

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

Trace de la pile:

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>

Chaîne d'entrée:

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

Lorsque vous générez un modèle JAXB à partir d'un schéma XML, les métadonnées des éléments globaux correspondant aux types complexes nommés sont capturées sous forme d'annotation @XmlElementDecl sur une méthode de création de la classe ObjectFactory. Puisque vous créez la JAXBContext uniquement sur la classe DocumentType, ces métadonnées ne sont pas traitées. Si vous avez généré votre modèle JAXB à partir d'un schéma XML, vous devez créer la variable JAXBContext sur le nom du package généré ou la classe ObjectFactory pour garantir le traitement de toutes les métadonnées nécessaires.

Exemple de solution:

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

Si vous souhaitez continuer à utiliser la classe DocumentType, vous pouvez également ajouter l'annotation suivante par-dessus votre classe DocumentType.

    @XmlRootElement(name="document")

Remarque: la valeur de chaîne "document" fait référence au nom de la balise racine du message xml.

27
bvdb

L'une des raisons de cette erreur est l'utilisation de l'implémentation de jaxb à partir du jdk. Je ne suis pas sûr de savoir pourquoi un tel problème peut apparaître dans des situations d'analyse XML assez simples. Vous pouvez utiliser la dernière version de la bibliothèque jaxb à partir d'un référentiel public maven:

http://mvnrepository.com

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

Dans notre cas, nous obtenions une exception UnmarshalException car un package Java incorrect a été spécifié dans ce qui suit. Le problème a été résolu une fois le bon package en place:

@Bean
public Unmarshaller tmsUnmarshaller() {
    final Jaxb2Marshaller jaxb2Marshaller = new Jaxb2Marshaller();
    jaxb2Marshaller
            .setPackagesToScan("Java.package.to.generated.Java.classes.for.xsd");
    return jaxb2Marshaller;
}
0
Erikson