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 문서에 “그룹”대신 “그룹”루트 요소가있는 것 같습니다. 다음을 수행 할 수 있습니다.
- XML의 루트 요소를 “그룹”으로 변경하십시오.
- @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;