javax.xml.bind.UnmarshalException : 예기치 않은 요소 (uri : "", local : "Group")


103
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에는 데이터 만 포함됩니다.

원인이 될 수 있습니까?


4
검색을 통해 여기에 오는 사람들을 위해 ObjectFactory생성 된 소스에서 잘못된 소스 를 사용하여 발생할 수 있다는 점에 대해 언급하고 싶습니다 . 두 개의 서로 다른 생성 된 소스 디렉토리를 혼합하는 경우 더 가능성이 높습니다.
bbarker

답변:


119

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

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

2
문제가 해결되었습니다. 감사합니다! 두 번째 솔루션 인 @XmlRootElement (name = "Group")를 사용했습니다. 내 클래스 이름은 Group이고 XML 루트 요소는 Group입니다. 여전히 name = "Group"이 필요한 이유
user496949 2011 년


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

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

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

33

운 좋게도 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에 추가 된 네임 스페이스를 볼 수 있습니다.


동일한 문제에 직면하고 귀하의 의견을 따랐으며 문제가 해결되었습니다. 감사합니다.
Bibin Zacharias

9

자세히 살펴본 후 Blaise가 지적한 것처럼 루트 요소는 스키마 네임 스페이스와 연결되어야합니다. 그러나 나는 package-info 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 2017-06-13

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

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;

0

저도 마찬가지입니다. 매핑 클래스의 이름은 Mbean이었지만 태그 루트 이름은 mbean주석을 추가해야했습니다.

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

0

나는 같은 문제가 있었다. elementFormDefault = "qualified"attributeFormDefault = "unqualified" 에 다음 속성을 추가했습니다.<xs:schema..>

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

package-info.java를 수정 한 xjc를 실행하여 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.