Pertanyaan javax.xml.bind.UnmarshalException: elemen tak terduga (uri: "", lokal: "Grup")


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

Temui pengecualian ketika tidak memetakan 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.

Apa pun bisa menjadi penyebabnya?


75
2018-03-05 10:50


asal


Jawaban:


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 (nama = "Grup") ke kelas Grup.

89
2018-03-05 11:04



Anda perlu menempatkan package-info.java di paket jaxb yang Anda buat. Isinya harus seperti itu

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

28
2017-08-16 07:27



Untungnya, kelas paket-info tidak diperlukan. Saya bisa memperbaiki masalah ranjau dengan solusi iowatiger08.

Berikut adalah perbaikan saya yang menunjukkan pesan kesalahan untuk membantu menggabungkan titik-titik bagi 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 setelah diperbaiki

@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 yang ditambahkan ke @XmlRootElement seperti yang ditunjukkan dalam pesan kesalahan.


14
2017-08-28 05:18



Setelah mencari lebih lanjut, elemen root harus dikaitkan dengan namespace-skema seperti yang diberitahukan Blaise. Namun, saya tidak memiliki paket-info java. 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!


7
2018-02-12 22:05



Ini adalah perbaikan untuk kasus penggunaan yang cukup ceruk tetapi itu membuat saya setiap kali. Jika Anda menggunakan generator Eclipse Jaxb itu menciptakan file yang disebut paket-info.

@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 akan memungkinkan xml yang lebih umum untuk diurai. Cobalah!


2
2018-05-11 16:07



Saya memiliki masalah yang sama .. Ini membantu saya, saya menentukan nama field yang sama dari kelas saya sebagai nama-nama tag dalam file xml (file 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 Tanggapan 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 Barang 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 RegionDaftar 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

1
2017-09-21 11:57



Sama dengan saya. Nama kelas pemetaan adalah Mbean tetapi nama belakang tagnya mbean jadi saya harus menambahkan anotasi:

@XmlRootElement(name="mbean")
public class MBean { ... }

0
2018-06-26 14:03



Jika tidak ada yang berfungsi di atas, coba tambahkan

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


0
2017-11-14 17:37