programing

를 참조해 주세요.Unmarshal Exception: 예기치 않은 요소(uri:", 로컬:"Group")

firstcheck 2022. 10. 8. 08:48
반응형

를 참조해 주세요.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" 루트 요소가 있는 것 같습니다.다음과 같은 작업을 수행할 수 있습니다.

  1. XML의 루트 요소를 "그룹"으로 변경합니다.
  2. 주석 @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.javacontextPath 패키지에 포함된 클래스로 동일한 클래스에 코드 아래에 배치됩니다.

@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

반응형