[java] javax.xml.bind.UnmarshalException : 예기치 않은 요소 (uri : “”, local : “Group”)

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

XML에서 역 정렬화할 때 예외를 만나십시오.

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

그룹 클래스에는 주석이 없으며 group.xml에는 데이터 만 포함됩니다.

원인이 될 수 있습니까?



답변

XML 문서에 “그룹”대신 “그룹”루트 요소가있는 것 같습니다. 다음을 수행 할 수 있습니다.

  1. XML의 루트 요소를 “그룹”으로 변경하십시오.
  2. @XmlRootElement (name = “Group”) 주석을 그룹 클래스에 추가하십시오.

답변

생성 된 jaxb 패키지에 package-info.java를 넣어야합니다. 내용은 다음과 같아야합니다.

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


답변

운 좋게도 package-info 클래스는 필요하지 않습니다. 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에 추가 된 네임 스페이스를 볼 수 있습니다.


답변

자세히 살펴본 후 Blaise가 지적한 것처럼 루트 요소는 스키마 네임 스페이스와 연결되어야합니다. 그러나 나는 package-info java가 없었습니다. 따라서 @XMLSchema 주석을 사용하지 않고 다음을 사용하여이 문제를 수정할 수있었습니다.

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

도움이 되었기를 바랍니다!


답변

이것은 꽤 틈새 유스 케이스에 대한 수정이지만 매번 나를 얻습니다. 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을 구문 분석 할 수 있습니다. 시도 해봐!


답변

나는 똑같은 문제가 있었다. 그것은 나를 도왔다. 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


답변

contextPathpackage-info.java 패키지에 클래스 를 넣고 동일한 클래스에 아래 코드를 넣어야합니다.

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