javax.xml.bind.UnmarshalException: phần tử không mong đợi (uri: “”, cục bộ: “Nhóm”)


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

Gặp một ngoại lệ khi giải phóng khỏi xml

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

Lớp nhóm không có bất kỳ chú thích nào và group.xml chỉ chứa dữ liệu.

Bất cứ điều gì có thể là nguyên nhân?


4
Đối với những người đến đây từ một tìm kiếm, tôi chỉ muốn nhận xét rằng điều này có thể do sử dụng không chính xác ObjectFactorytừ các nguồn được tạo, điều này có nhiều khả năng xảy ra nếu bạn đang trộn hai thư mục nguồn được tạo khác nhau.
bbarker

Câu trả lời:


119

Có vẻ như tài liệu XML của bạn có phần tử gốc là "Group" thay vì "group". Bạn có thể:

  1. Thay đổi phần tử gốc trên XML của bạn thành "nhóm"
  2. Thêm chú thích @XmlRootElement (name = "Group") vào Nhóm nhóm.

2
Nó đã giải quyết được vấn đề, Cảm ơn! Tôi đã sử dụng giải pháp thứ hai, @XmlRootElement (name = "Group"). Tên lớp của tôi là Group, và phần tử gốc XML là Group, tại sao tôi vẫn cần name = "Tập đoàn"
user496949


2
@BlaiseDoughan Tôi đang gặp vấn đề hoàn toàn ngược lại, tôi có @XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })nhưng tôi đang hiểu unexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>tôi cũng gặp phải @XmlElement(name="Date", required = true)vấn đề trên từng lĩnh vực. Ở đâu & Tại sao nó lại sai? Tôi cũng đã thử xóa @XmlRootElement!
Rahul Thakur

4
Đã xảy ra sự cố với @XmlSchematrong package-info.java, đã được khắc phục.
Rahul Thakur

35

Bạn cần đặt package-info.java trong gói jaxb đã tạo của mình. Nội dung của nó phải như thế

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

33

May mắn thay, lớp thông tin gói không bắt buộc. Tôi đã có thể khắc phục sự cố của mình bằng giải pháp iowatiger08.

Đây là bản sửa lỗi của tôi hiển thị thông báo lỗi để giúp tham gia các dấu chấm cho một số.

Thông báo lỗi

javax.xml.bind.UnmarshalException: phần tử không mong đợi (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", cục bộ: "errorresource"). Các phần tử được mong đợi là <{} errorresource>

Mã trước khi sửa

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

Mã sau khi sửa chữa

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

Bạn có thể thấy vùng tên được thêm vào @XmlRootElement như được chỉ ra trong thông báo lỗi.


Đối mặt với cùng một vấn đề và theo dõi bình luận của bạn và vấn đề đã được giải quyết. Cảm ơn bạn.
Bibin Zacharias

9

Sau khi xem xét kỹ hơn, phần tử gốc phải được liên kết với một không gian tên lược đồ như Blaise đang lưu ý. Tuy nhiên, tôi không có java gói thông tin. Vì vậy, mà không cần sử dụng chú thích @XMLSchema, tôi có thể khắc phục sự cố này bằng cách sử dụng

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

Hi vọng điêu nay co ich!


thêm một không gian tên vào đá phần tử gốc! :-)
Konstantin Ivanov

5

Đây là một bản sửa lỗi cho một trường hợp sử dụng khá thích hợp nhưng nó khiến tôi gặp phải mỗi lần. Nếu bạn đang sử dụng trình tạo Jaxb của Eclipse, nó sẽ tạo một tệp có tên là gói-thông tin.

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

Nếu bạn xóa tệp này, nó sẽ cho phép phân tích cú pháp xml chung chung hơn. Hãy thử một lần!


1
Nó đã hoàn hảo sau đó .. Cảm ơn rất nhiều người bạn đời .. :). Tôi chỉ làm cho không gian tên được đề cập thành chuỗi trống.
Arundev

2

Tôi đã gặp vấn đề tương tự .. Nó đã giúp tôi, tôi chỉ định cùng một tên trường của các lớp của tôi với tên thẻ trong tệp xml (tệp đến từ một hệ thống bên ngoài).

Ví dụ:

Tệp xml của tôi:

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

Lớp phản hồi của tôi:

@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
}

Lớp ESList của tôi:

@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
}

Hạng mục của tôi:

@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
}

Lớp Danh sách Vùng của tôi:

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

    // getters and setters here
}

Lớp DemoUnmarshalling của tôi:

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();
        }
    }
}

Nó cho:

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

1

Bạn cần đặt package-info.javalớp trong gói contextPath và đặt mã bên dưới vào cùng một lớp:

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

0

Giống tôi. Tên của lớp ánh xạ là Mbeannhưng tên gốc của thẻ là mbeando vậy tôi phải thêm chú thích:

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

0

Tôi gặp vấn đề tương tự. Tôi đã thêm các thuộc tính sau vào <xs:schema..> elementFormDefault = "đủ điều kiện" thuộc tínhFormDefault = "không đủ tiêu chuẩn"

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

và tạo lại các lớp java bằng cách chạy xjc, cách này đã sửa lỗi package-info.java.

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

Điều này đã khắc phục sự cố cho tôi.


0

Tôi đã gặp vấn đề tương tự và tôi chỉ thay đổi như sau:

@XmlRootElement -> @XmlRootElement(name="Group")

0

Tôi đã gặp vấn đề tương tự, vấn đề của tôi là tôi có hai dịch vụ web khác nhau với hai tệp wsdl khác nhau. Tôi đã tạo các nguồn trong cùng một gói cho cả hai dịch vụ web, điều này có vẻ là một vấn đề. Tôi đoán đó là do ObjectFactory và có lẽ cũng vì package-info.java - vì chúng chỉ được tạo một lần.

Tôi đã giải quyết nó, bằng cách tạo các nguồn cho mỗi dịch vụ web trong một gói khác nhau. Bằng cách này, bạn cũng có hai tệp ObjectFactories và package-info.java khác nhau.


0

Trong trường hợp bạn đang phát điên vì điều này chỉ xảy ra trong các Bài kiểm tra của bạn và bạn đang sử dụng PowerMock thì đây là giải pháp, hãy thêm nó vào đầu lớp kiểm tra của bạn:

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

0

Không có giải pháp nào được đề cập ở đây phù hợp với tôi, tôi vẫn nhận được:

Ngoại lệ trong chuỗi "main" javax.xml.bind.UnmarshalException: phần tử không mong đợi (uri: "java: XXX.XX.XX.XXX", cục bộ: "XXXXX")

Sau rất nhiều nghiên cứu thông qua các trang web khác, mã dưới đây đã làm việc cho tôi-

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();

-1

Nếu không có cách nào ở trên hoạt động, hãy thử thêm

@XmlRootElement(name="Group") vào nhóm Nhóm.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.