javax.xml.bind.UnmarshalException: องค์ประกอบที่ไม่คาดคิด (uri:“”, local:“ Group”)


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

พบข้อยกเว้นเมื่อ unmarshalling จาก xml

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

คลาสกลุ่มไม่มีคำอธิบายประกอบใด ๆ และ group.xml มีเพียงข้อมูล

อะไรสามารถเป็นสาเหตุ?


4
สำหรับผู้ที่มาที่นี่จากการค้นหาฉันแค่อยากจะแสดงความคิดเห็นว่าสิ่งนี้อาจเกิดจากการใช้ObjectFactoryแหล่งที่มาที่สร้างขึ้นไม่ถูกต้องซึ่งมีแนวโน้มมากขึ้นหากคุณผสมไดเรกทอรีต้นทางที่สร้างขึ้นสองรายการ
bbarker

คำตอบ:


119

ดูเหมือนว่าเอกสาร XML ของคุณจะมีองค์ประกอบราก "Group" แทนที่จะเป็น "group" คุณสามารถ:

  1. เปลี่ยนองค์ประกอบรากบน XML ของคุณเป็น "กลุ่ม"
  2. เพิ่มคำอธิบายประกอบ @XmlRootElement (name = "Group") ในคลาส Group

2
มันแก้ปัญหาได้ขอบคุณ! ฉันใช้โซลูชันที่สอง @XmlRootElement (name = "Group") ชื่อคลาสของฉันคือ Group และองค์ประกอบราก XML คือ Group ทำไมฉันยังต้องการ name = "Group"
user496949


2
@BlaiseDoughan ฉันมีปัญหาตรงข้ามฉันมี@XmlRootElement(name = "MB") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "MB", propOrder = { "date", "time" })แต่ฉันได้รับunexpected element (uri:"http://xx.title.com/new/response", local:"MB"). Expected elements are <{}Date>,<{}MB>,<{}Time>ฉันยังมี@XmlElement(name="Date", required = true)ในแต่ละฟิลด์ ที่ไหน & ทำไมมันผิด? ฉันได้ลองลบแล้วด้วย@XmlRootElement!
Rahul Thakur

4
มีปัญหา@XmlSchemaในpackage-info.javaแก้ไขแล้ว
Rahul Thakur

35

คุณต้องใส่ package-info.java ในแพ็คเกจ jaxb ที่คุณสร้างขึ้น เนื้อหาควรเป็นแบบนั้น

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

33

โชคดีที่ไม่จำเป็นต้องใช้คลาสข้อมูลแพ็คเกจ ฉันสามารถแก้ไขปัญหาของฉันด้วยโซลูชัน iowatiger08

นี่คือการแก้ไขของฉันที่แสดงข้อความแสดงข้อผิดพลาดเพื่อช่วยในการรวมจุดสำหรับบางคน

ข้อความผิดพลาด

javax.xml.bind.UnmarshalException: องค์ประกอบที่ไม่คาดคิด (uri: " http://global.aon.bz/schema/cbs/archive/errorresource/0 ", local: "errorresource") องค์ประกอบที่คาดหวังคือ <{} errorresource>

รหัสก่อนแก้ไข

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

รหัสหลังจากแก้ไข

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

คุณสามารถดูเนมสเปซที่เพิ่มใน @XmlRootElement ตามที่ระบุในข้อความแสดงข้อผิดพลาด


ประสบปัญหาเดียวกันและปฏิบัติตามความคิดเห็นของคุณและปัญหาได้รับการแก้ไข ขอบคุณ.
Bibin Zacharias

9

หลังจากดูเพิ่มเติมแล้วองค์ประกอบรากจะต้องเชื่อมโยงกับสคีมา - เนมสเปซเนื่องจากเบลสสังเกตเห็น แต่ฉันไม่มี java ข้อมูลแพ็คเกจ ดังนั้นหากไม่ใช้คำอธิบายประกอบ @XMLSchema ฉันก็สามารถแก้ไขปัญหานี้ได้โดยใช้ไฟล์

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

หวังว่านี่จะช่วยได้!


เพิ่มเนมสเปซให้กับหินองค์ประกอบราก! :-)
Konstantin Ivanov

5

นี่เป็นการแก้ไขสำหรับกรณีการใช้งานเฉพาะกลุ่มที่สวย แต่ทำให้ฉันได้รับทุกครั้ง หากคุณใช้ตัวสร้าง Eclipse Jaxb มันจะสร้างไฟล์ชื่อ package-info

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

หากคุณลบไฟล์นี้จะทำให้สามารถแยกวิเคราะห์ xml ทั่วไปได้มากขึ้น ให้มันลอง!


1
หลังจากนั้นก็ตื่นขึ้นมาอย่างสมบูรณ์แบบ .. ขอบคุณเพื่อนมาก .. :). ฉันเพิ่งสร้างเนมสเปซที่กล่าวถึงเป็นสตริงว่าง
Arundev

2

ฉันมีปัญหาเดียวกัน .. ช่วยฉันด้วยฉันระบุชื่อฟิลด์เดียวกันของคลาสของฉันเป็นชื่อแท็กในไฟล์ xml (ไฟล์มาจากระบบภายนอก)

ตัวอย่างเช่น:

ไฟล์ xml ของฉัน:

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

คลาสตอบกลับของฉัน:

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

คลาส ESList ของฉัน:

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

คลาสไอเทมของฉัน:

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

คลาส RegionList ของฉัน:

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

    // getters and setters here
}

คลาส DemoUnmarshalling ของฉัน:

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

ให้:

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

1

คุณต้องใส่package-info.javaคลาสในแพ็คเกจของcontextPathและใส่โค้ดด้านล่างในคลาสเดียวกัน:

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

0

เหมือนกันกับฉัน ชื่อของคลาสการแมปเป็นMbeanแต่ชื่อรูทของแท็กmbeanดังนั้นฉันจึงต้องเพิ่มคำอธิบายประกอบ:

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

0

ฉันมีปัญหาเดียวกัน ฉันเพิ่มแอตทริบิวต์ต่อไปนี้ใน<xs:schema..> elementFormDefault = "คุณสมบัติ" attributeFormDefault = "unqualified"

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

และสร้างคลาส java ขึ้นมาใหม่โดยรัน xjc ซึ่งแก้ไข package-info.java

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

สิ่งนี้ช่วยแก้ปัญหาให้ฉันได้


0

ฉันมีปัญหาเดียวกันอยู่แล้วและฉันเพิ่งเปลี่ยนดังนี้:

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

0

ฉันมีปัญหาเดียวกันปัญหาของฉันคือฉันมีสองบริการเว็บที่แตกต่างกันโดยมีไฟล์ wsdl สองไฟล์ที่แตกต่างกัน ฉันสร้างแหล่งที่มาในแพ็คเกจเดียวกันสำหรับบริการเว็บทั้งสองซึ่งดูเหมือนจะเป็นปัญหา ฉันเดาว่าเป็นเพราะ ObjectFactory และอาจเป็นเพราะ package-info.java - เนื่องจากสิ่งเหล่านี้ถูกสร้างขึ้นเพียงครั้งเดียว

ฉันแก้ไขมันโดยการสร้างแหล่งที่มาสำหรับแต่ละบริการเว็บในแพ็คเกจที่แตกต่างกัน ด้วยวิธีนี้คุณยังมีไฟล์ ObjectFactories และ package-info.java ที่แตกต่างกันสองไฟล์


0

ในกรณีที่คุณกำลังจะบ้าเพราะสิ่งนี้เกิดขึ้นเฉพาะในการทดสอบของคุณและคุณกำลังใช้ PowerMock นี่คือวิธีแก้ปัญหาให้เพิ่มลงบนคลาสทดสอบของคุณ:

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

0

ไม่มีวิธีแก้ปัญหาใดที่กล่าวถึงที่นี่ที่ใช้ได้ผลสำหรับฉันฉันยังคงได้รับ:

ข้อยกเว้นในเธรด "main" javax.xml.bind.UnmarshalException: องค์ประกอบที่ไม่คาดคิด (uri: "java: XXX.XX.XX.XXX", local: "XXXXX")

หลังจากการวิจัยจำนวนมากผ่านไซต์อื่น ๆ ด้านล่างรหัสได้ผลสำหรับฉัน -

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

หากวิธีการข้างต้นไม่ได้ผลให้ลองเพิ่ม

@XmlRootElement(name="Group") ไปยังคลาสกลุ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.