2013-09-03 7 views
2

현재 XML 메시지를 마샬링/언 마샬링하고 있습니다. 여기 내 두 개의 XML 요소는 다음과 같습니다JAXB 기본 네임 스페이스 사용

@XmlRootElement(namespace = "http://namespaceA") 
public class RootElementA { 

    @XmlElement 
    private ElementXX elementXX; 

} 

@XmlRootElement(namespace = "http://namespaceB") 
public class RootElementB { 

    @XmlElement 
    private ElementXX elementXX; 

} 

나는 다음과 같은 오류 가지고 RootElementB 비 정렬 :이 발생한 것을 제외하고 나는 ElementXX 선언에 네임 스페이스를 추가하는 경우

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://namespaceB", local:"ElementXX"). Expected elements are <{}ElementXX> 

, 내가 같은 오류가 ElementXX의 속성

문제는이 두 네임 스페이스에 지정되고 난 그냥 네임 스페이스를 변경하는 내 수업을 복제하지 않기 때문에 내가

당신을합니까 ... ElementXX의 특성에 네임 스페이스를 설정할 수 있다는 것입니다 아이디어가 있으십니까? 감사합니다. . 내가 XmlRootElementA 클래스의 ElementXX에 네임 스페이스를 설정하지 않으면 내가 위의 오류가

<RootElementA xmlns="http://namespaceA"> 
    <ElementXX> 
     <name>blabla</name> 
     <desc>blabla</desc> 
    </ElementXX> 
</RootElementA> 

:

편집 여기

는 XML의 샘플입니다. 설정 한 경우 name 속성과 동일한 오류가 발생합니다.

답변

0

당신은 모양을 가지고 여기에 XML을 didnt는 ...하지만 난 아래 링크를 당신에게 대답을 줄 것 같아요.

XML unmarshalling using Jaxb with namespaces and schema

당신이 비 직렬화하려고하는 XML을 게시하지 않은 경우.

+0

나는 XML로 내 질문에 업데이트되었습니다. XML은 외부 API에서오고 있으므로 언 마샬링하기 전에 편집 할 수 없습니다 (링크에서 답을 찾지 못했습니다). – c4k

1

당신은 ElementXX@XmlElement 주석을 제거 할 수 있습니다. 공용 getter가있는 한 기본 동작은이를 마샬링하는 것입니다.

그러면 XML은 다음과 같아야합니다.

<ns3:rootElementB xmlns:ns2="http://namespaceA" xmlns:ns3="http://namespaceB"> 
    <elementXX/> 
</ns3:rootElementB> 

대안은

XML은 다음과 같을 것이다 RootElementA와 B는 다음 RootElementA와 B에 @XmlElementRef@XmlElement 교체와 유사한 @XmlRootElement를 사용하여 자바 클래스에 ElementXX의 네임 스페이스를 선언하는 것입니다 : ( : 내가 정확하게 오류를 재현 할 수 없습니다 테스트에 대한 필드 이름)

<ns4:rootElementB xmlns:ns2="http://namespaceXX" xmlns:ns3="http://namespaceA" xmlns:ns4="http://namespaceB"> 
    <ns2:elementXX> 
     <name>test</name> 
    </ns2:elementXX> 
</ns4:rootElementB> 

을 추가했다. 그러나 두 개의 네임 스페이스로 선언 된 ElementXX을 사용하는 것이 바람직하지는 않습니다. 스키마를 수정할 수 있다면 고유 한 네임 스페이스를 사용하여 새 스키마를 만들고 ElementXX을 선언하는 것이 좋습니다. 그런 다음 다른 두 요소를 수정하여 요소를 참조하십시오.

+0

"그러나 ElementXX를 두 개의 네임 스페이스로 선언하는 것은 바람직하지 않습니다.": 전적으로 동의하지만 외부 API 용 스키마를 사용하고 있습니다. 수정할 수는 없습니다. 사실 RootElementA의 네임 스페이스 A의 ElementXX와 RootElementB의 네임 스페이스 B의 ElementXX를 사용하고 싶습니다. 선언에 네임 스페이스를 지정하지 않아도됩니다. 그게 가능하니? – c4k

0

당신은 패키지 내 클래스와 속성에 대한 네임 스페이스의 자격을 지정 @XmlSchema 주석을 사용할 수 있습니다. @XmlType에 네임 스페이스를 지정하여 클래스의 속성에 대한 네임 스페이스를 지정할 수 있습니다. 그런 다음 @XmlRootElement, @XmlElement@XmlAttribute을 사용하여 단일 요소/속성에 대한 네임 스페이스를 지정할 수 있습니다.추가 정보

+0

링크를 주셔서 감사합니다,하지만 내 문제는 여기에 내 도움이되지 않습니다.) 주된 문제는 namespaceB를 RootElementB의 ElementXX로 설정하면 ElementXX 내부의 요소에 위의 오류가 있다는 것입니다 ... 그리고 어떤 것도 설정할 수 없습니다 ElementXX의 네임 스페이스가 내 클래스 인 namespaceA와 namespaceB에있는 XML 요소에 대한 매핑입니다 ... RootElementA에 ElementXX를 추가 할 때 namespaceA를 사용하고 RootElementB에 namespaceB를 사용할 때를 지정하고 싶습니다. – c4k

+0

@Chafik - 2가 있습니다. 뚜렷한'elementXX' 속성이있어서 내가 지적한 메커니즘 중 하나를 사용하여 처리됩니다. 여기서 진짜 문제는'ElementXX'의 인스턴스를 어떻게 처리 할 것인가입니다. –

+0

정확히. – c4k

관련 문제