javax.xml.bind.UnmarshalException: elemen tak terduga (uri: “”, local: “Group”)

103
unexpected element (uri:"", local:"Group"). Expected elements are <{}group>

Memenuhi pengecualian saat membatalkan marshalling dari xml

JAXBContext jc = JAXBContext.newInstance(Group.class); 
Unmarshaller unmarshaller = jc.createUnmarshaller();
Group group = (User)unmarshaller.unmarshal(new File("group.xml"));

Kelas grup tidak memiliki anotasi dan group.xml hanya berisi data.

Ada yang bisa jadi penyebabnya?

pengguna496949
sumber
4
Bagi mereka yang datang ke sini dari pencarian, saya hanya ingin berkomentar bahwa ini dapat disebabkan oleh penggunaan yang salah ObjectFactorydari sumber yang dihasilkan, yang lebih mungkin terjadi jika Anda mencampur dua direktori sumber yang dihasilkan berbeda.
bbarker

Jawaban:

119

Sepertinya dokumen XML Anda memiliki elemen root "Grup", bukan "grup". Kamu bisa:

  1. Ubah elemen root pada XML Anda menjadi "grup"
  2. Tambahkan anotasi @XmlRootElement (name = "Group") ke kelas Grup.
bdoughan.dll
sumber
2
Ini memecahkan masalah, Terima kasih! Saya menggunakan solusi kedua, @XmlRootElement (name = "Group"). Nama kelas saya adalah Grup, dan elemen akar XML adalah Grup, mengapa saya masih membutuhkan name = "Grup"
user496949
2
@BlaiseDoughan Saya mengalami masalah yang justru sebaliknya, saya punya @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })tetapi saya mendapatkan unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>saya juga memiliki @XmlElement(name="Date", required = true)atas setiap bidang. Di mana & Mengapa terjadi kesalahan? Saya juga sudah mencoba menghapus @XmlRootElement!
Rahul Thakur
4
Ada masalah dengan @XmlSchemamasuk package-info.java, diperbaiki sekarang.
Rahul Thakur
35

Anda perlu memasukkan package-info.java ke dalam paket jaxb yang Anda buat. Isinya harus seperti itu

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;
Ahmed Azraq
sumber
33

Untungnya, kelas info paket tidak diperlukan. Saya dapat memperbaiki masalah saya dengan solusi iowatiger08.

Inilah perbaikan saya yang menunjukkan pesan kesalahan untuk membantu menggabungkan titik-titik untuk beberapa orang.

Pesan eror

javax.xml.bind.UnmarshalException: elemen tak terduga (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", lokal: "errorresource"). Elemen yang diharapkan adalah <{} errorresource>

Kode sebelum diperbaiki

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource")
public class Errorresource

Kode demi perbaikan

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="", propOrder={"error"})
@XmlRootElement(name="errorresource", namespace="http://global.aon.bz/schema/cbs/archive/errorresource/0")
public class Errorresource

Anda dapat melihat namespace ditambahkan ke @XmlRootElement seperti yang ditunjukkan dalam pesan kesalahan.

Glenn Mason
sumber
Menghadapi masalah yang sama dan mengikuti komentar Anda dan masalah tersebut teratasi. Terima kasih.
Bibin Zacharias
9

Setelah melihat lebih jauh, elemen root harus dikaitkan dengan ruang nama skema seperti yang diperhatikan Blaise. Namun, saya tidak memiliki java info paket. Jadi tanpa menggunakan anotasi @XMLSchema, saya dapat memperbaiki masalah ini dengan menggunakan

@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}

Semoga ini membantu!

iowatiger08
sumber
menambahkan namespace ke elemen root keren! :-)
Konstantin Ivanov
5

Ini adalah perbaikan untuk kasus penggunaan khusus yang cukup tetapi selalu berhasil. Jika Anda menggunakan generator Eclipse Jaxb, ia membuat file bernama info-paket.

@javax.xml.bind.annotation.XmlSchema(namespace = "blah.xxx.com/em/feed/v2/CommonFeed")
package xxx.blah.mh.domain.pl3xx.startstop;

Jika Anda menghapus file ini, ini akan memungkinkan xml yang lebih umum untuk diurai. Cobalah!

markthegrea.dll
sumber
1
Ini terbangun sempurna setelah itu .. Terima kasih banyak sobat .. :). Saya baru saja membuat namespace yang disebutkan menjadi string kosong.
Arundev
2

Saya memiliki masalah yang sama .. Ini membantu saya, saya menentukan nama bidang yang sama dari kelas saya sebagai nama tag di file xml (file tersebut berasal dari sistem eksternal).

Sebagai contoh:

File xml saya:

<Response>
  <ESList>
     <Item>
        <ID>1</ID>
        <Name>Some name 1</Name>
        <Code>Some code</Code>
        <Url>Some Url</Url>
        <RegionList>
           <Item>
              <ID>2</ID>
              <Name>Some name 2</Name>
           </Item>
        </RegionList>
     </Item>
  </ESList>
</Response>

Kelas Respon Saya:

@XmlRootElement(name="Response")
@XmlAccessorType(XmlAccessType.FIELD)
public class Response {
    @XmlElement
    private ESList[] ESList = new ESList[1]; // as the tag name in the xml file..

    // getter and setter here
}

Kelas ESList saya:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name="ESList")
public class ESList {
    @XmlElement
    private Item[] Item = new Item[1]; // as the tag name in the xml file..

    // getters and setters here
}

Kelas Item saya:

@XmlRootElement(name="Item")
@XmlAccessorType(XmlAccessType.FIELD)
public class Item {
    @XmlElement
    private String ID; // as the tag name in the xml file..
    @XmlElement
    private String Name; // and so on...
    @XmlElement
    private String Code;
    @XmlElement
    private String Url;
    @XmlElement
    private RegionList[] RegionList = new RegionList[1];

    // getters and setters here
}

Kelas RegionList saya:

@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
    Item[] Item = new Item[1];

    // getters and setters here
}

Kelas DemoUnmarshalling saya:

public class DemoUnmarshalling {
    public static void main(String[] args) {
        try {
            File file = new File("...");

            JAXBContext jaxbContext = JAXBContext.newInstance(Response.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
            jaxbUnmarshaller.setEventHandler(
                new ValidationEventHandler() {
                    public boolean handleEvent(ValidationEvent event ) {
                        throw new RuntimeException(event.getMessage(),
                            event.getLinkedException());
                    }
                }
            );

            Response response = (Response) jaxbUnmarshaller.unmarshal(file);

            ESList[] esList = response.getESList();
            Item[] item = esList[0].getItem();
            RegionList[] regionLists = item[0].getRegionList();
            Item[] regionListItem = regionLists[0].getItem();

            System.out.println(item[0].getID());
            System.out.println(item[0].getName());
            System.out.println(item[0].getCode());
            System.out.println(item[0].getUrl());
            System.out.println(regionListItem[0].getID());
            System.out.println(regionListItem[0].getName());

        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

Memberikan:

1
Some name 1
Some code
Some Url
2
Some name 2

sumber
1

Anda perlu menempatkan package-info.javakelas dalam paket konteksPath dan meletakkan kode di bawah ini di kelas yang sama:

@javax.xml.bind.annotation.XmlSchema(namespace = "https://www.namespaceUrl.com/xml/", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.test.valueobject;
ankit
sumber
0

Aku juga. Nama kelas pemetaan adalah Mbeantetapi nama root tag mbeanjadi saya harus menambahkan anotasi:

@XmlRootElement(name="mbean")
public class MBean { ... }
Laura Liparulo
sumber
0

Saya memiliki masalah yang sama. Saya menambahkan atribut berikut ke <xs:schema..> elementFormDefault = "kualifikasi" atributFormDefault = "tidak memenuhi syarat"

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns="http://www.example.com/schemas/ArrayOfMarketWithStations"
    targetNamespace="http://www.example.com/schemas/ArrayOfMarketWithStations" 
    elementFormDefault="qualified" attributeFormDefault="unqualified" >

dan membuat ulang kelas java dengan menjalankan xjc, yang mengoreksi package-info.java.

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)

Ini memperbaiki masalah saya.

Rashmi
sumber
0

Saya sudah memiliki masalah yang sama dan saya hanya mengubah seperti di bawah ini:

@XmlRootElement -> @XmlRootElement(name="Group")
rabieh idul fitri
sumber
0

Saya memiliki masalah yang sama, masalah saya adalah, bahwa saya memiliki dua layanan web yang berbeda dengan dua file wsdl yang berbeda. Saya membuat sumber dalam paket yang sama untuk kedua layanan web, yang tampaknya menjadi masalah. Saya kira itu karena ObjectFactory dan mungkin juga karena package-info.java - karena itu hanya dibuat sekali.

Saya menyelesaikannya, dengan membuat sumber untuk setiap layanan web dalam paket yang berbeda. Dengan cara ini, Anda juga memiliki dua file ObjectFactories dan package-info.java yang berbeda.

Sepultura
sumber
0

Jika Anda menjadi gila karena ini hanya terjadi dalam Tes Anda dan Anda menggunakan PowerMock ini solusinya, tambahkan di atas kelas tes Anda:

@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })
Massimo
sumber
0

Tidak ada solusi yang disebutkan di sini yang berhasil untuk saya, saya masih mendapatkan:

Pengecualian di utas "main" javax.xml.bind.UnmarshalException: elemen tak terduga (uri: "java: XXX.XX.XX.XXX", lokal: "XXXXX")

Setelah banyak penelitian melalui situs lain di bawah kode bekerja untuk saya

FileInputStream fis = new FileInputStream("D:/group.xml");
SOAPMessage message = factory.createMessage(new MimeHeaders(), fis);
JAXBContext jc = JAXBContext.newInstance(Group.class);
Unmarshaller u = jc.createUnmarshaller();
JAXBElement<Group> r = u.unmarshal(message.getSOAPBody().extractContentAsDocument(), Group.class);
Group group = r.getValue();
Xavi
sumber
-1

Jika tidak ada satu pun cara di atas yang berhasil, coba tambahkan

@XmlRootElement(name="Group") ke kelas Grup.

FOO
sumber