를 참조해 주세요.Unmarshal Exception: 예기치 않은 요소(uri:", 로컬:"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 문서에 "group" 대신 "Group" 루트 요소가 있는 것 같습니다.다음과 같은 작업을 수행할 수 있습니다.
- XML의 루트 요소를 "그룹"으로 변경합니다.
- 주석 @XmlRootElement(name="Group")를 그룹 클래스에 추가합니다.
다행히 package-info 클래스는 필요하지 않습니다.저는 iowatiger08 솔루션으로 문제를 해결할 수 있었습니다.
이것은 일부의 점 접합에 도움이 되는 오류 메시지를 보여주는 수정 사항입니다.
에러 메시지
를 참조해 주세요.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에 추가된 네임스페이스를 볼 수 있습니다.
생성된 jaxb 패키지에 package-info.java를 넣어야 합니다.그 내용은 그런 것이어야 한다.
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/StudentOperations/")
package generated.marsh;
자세한 내용을 확인한 후 Blaise가 지적한 바와 같이 루트 요소는 스키마 네임스페이스와 관련지을 필요가 있습니다.하지만 패키지 정보 자바가 없었습니다.그래서 @XMLSchema 주석을 사용하지 않고도 이 문제를 해결할 수 있었습니다.
@XmlRootElement (name="RetrieveMultipleSetsResponse", namespace = XMLCodeTable.NS1)
@XmlType(name = "ns0", namespace = XMLCodeTable.NS1)
@XmlAccessorType(XmlAccessType.NONE)
public class RetrieveMultipleSetsResponse {//...}
이게 도움이 됐으면 좋겠네요!
이것은 꽤 틈새한 활용 사례에 대한 수정이지만 매번 나를 괴롭힌다.Eclipse Jaxb 생성기를 사용하는 경우 패키지 정보라는 파일이 생성됩니다.
@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
}
My RegionList 클래스:
@XmlRootElement(name="RegionList")
@XmlAccessorType(XmlAccessType.FIELD)
public class RegionList {
Item[] Item = new Item[1];
// getters and setters here
}
내 Demo Unmarshalling 클래스:
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
여기에 언급된 솔루션 중 어느 것도 효과가 없었으며, 저는 여전히 다음과 같은 이점을 얻고 있었습니다.
스레드 "main" javax.xml.bind에 예외가 있습니다.UnmarshalException: 예기치 않은 요소(uri:"java:XXX)입니다.XX.XX.XX", 로컬:"XXXXXX")
코드 아래의 다른 사이트를 통해 많은 조사를 한 결과, 저는 효과가 있었습니다.
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();
그래서 나는 내 것이 아닌 xsd 파일에서 미리 생성된 클래스를 사용할 때 너의 예외가 있었어.
생성된 xml-object name과 네임스페이스(@xmlroot)가 java-class에 없기 때문에 마샬링을 해제할 수 없습니다.누락된 URI를 클래스 위에 배치하면 다음과 같이 문제가 해결됩니다.
@XmlRootElement(name = "XHE", namespace = "http://docs.oasis-open.org/bdxr/ns/XHE/1/ExchangeHeaderEnvelope")
public class XHEType {
하지만 나는 이 수업이 목표에만 있기를 원했기 때문에, 이것만으로는 충분하지 않았다.마지막으로 생각해낸 것은 생성된 클래스를 랩하는 새로운 클래스입니다.그 대신 @xmlroot를 넣습니다.
@XmlRootElement(name = "XHE", namespace = "http://docs.oasis-open.org/bdxr/ns/XHE/1/ExchangeHeaderEnvelope")
public class XHEType2 extends XHEType {
그리고 언마샬 코드:
JAXBContext jaxbContext = JAXBContext.newInstance(XHEType2.class);
javax.xml.bind.Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
XHEType xheType = (XHEType) unmarshaller.unmarshal(reader);
넣으셔야 돼요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;
이 문제가 테스트에서만 발생하고 PowerMock을 사용하는 경우, 이것이 해결책입니다.테스트 클래스 위에 추가합니다.
@PowerMockIgnore({ "javax.xml.*", "org.xml.*", "org.w3c.*" })
나도 마찬가지야.매핑 클래스의 이름은Mbean
태그 루트 이름은mbean
그래서 주석을 달아야 했습니다.
@XmlRootElement(name="mbean")
public class MBean { ... }
위 중 하나라도 작동하지 않으면 다음을 추가해 보십시오.
@XmlRootElement(name="Group")
그룹 클래스로 이동합니다.
저도 같은 문제가 있었어요.에 다음 속성을 추가했습니다.<xs:schema..>
elementFormDefault="qualified" attributFormDefault="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" >
xjc를 실행하여 Java 클래스를 다시 생성했습니다.이것에 의해 package-info.disc가 수정되었습니다.
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.com/schemas/ArrayOfMarketWithStations", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
이것으로 나는 문제를 해결했다.
이미 같은 문제가 발생하여 다음과 같이 변경합니다.
@XmlRootElement -> @XmlRootElement(name="Group")
같은 문제가 있었습니다만, 문제는, 2개의 다른 wsdl 파일을 가지는 2개의 다른 Web 서비스가 있었다는 것입니다.두 웹 서비스의 소스를 동일한 패키지로 생성했는데 문제가 있는 것 같습니다.Object Factory 때문인 것 같습니다.또한 package-info.java 때문인 것 같습니다.이는 1회밖에 생성되지 않기 때문입니다.
각 웹 서비스의 소스를 다른 패키지로 생성하여 해결했습니다.이렇게 하면 2개의 다른 ObjectFactories 파일과 package-info.java 파일도 얻을 수 있습니다.
언급URL : https://stackoverflow.com/questions/5203312/javax-xml-bind-unmarshalexception-unexpected-element-uri-localgroup
'programing' 카테고리의 다른 글
Python을 사용하여 문자열에서 문자를 삭제하는 방법 (0) | 2022.10.08 |
---|---|
matplotlib의 산점도에서 각 열에 대해 다른 색상 설정 (0) | 2022.10.08 |
Fetch GET 요청을 사용하여 쿼리 문자열 설정 (0) | 2022.10.08 |
사용자가 HTTP가 아닌 HTTPS를 통해 내 페이지에 강제로 액세스하도록 하려면 어떻게 해야 합니까? (0) | 2022.10.08 |
다중 테이블 선택과 JOIN (퍼포먼스) (0) | 2022.10.08 |