2014-08-29 3 views
1

그래서이 특정 문제에 대한 해결책을 찾기 위해 많은 노력을 기울였습니다. 누군가가 좋은 방향으로 나를 가리킬 수 있기를 바랍니다.누락 된 네임 스페이스 정의가있는 JAXB 문제

우리는 데이터를 XML로 받고 있으며 XSD 만 있으면 데이터의 유효성을 검사 할 수 있습니다. 그래서 JAXB를 사용하여 Java 클래스를 생성했습니다. 샘플 XML을 비 정렬화할 때 일부 속성 값이 누락되었음을 발견했습니다. 스키마에서 이러한 특성이 QName이 될 것으로 예상하지만 데이터 공급자는 XML에서 접두사를 정의하지 않은 것으로 나타났습니다.

예를 들어 하나의 XML 속성 값은 "repository:<uuid>"이지만 네임 스페이스 접두어 "저장소"는 데이터 집합에서 정의되지 않습니다.

샘플 세트를 언 마샬 할 때 지정된 접두사 (위 샘플에서 "저장소")가있는 QName 속성이 NULL입니다! 그래서 그것은 JAXB가 정의되지 않은 네임 스페이스 접두어를 가진 속성 QName 값을 "버리고"있는 것처럼 보입니다. 나는 그것이 지역 이름조차 보존하지 않는다는 사실에 놀랐다.

이상적으로는 값을 그대로 유지하고 싶지만 QName을 바인딩 타임 (Java에 대한 스키마)에서 String으로 매핑 할 수없는 것처럼 보입니다.

"수동으로"XML에 네임 스페이스 정의를 삽입하려고 시도했지만 매력처럼 작동합니다. 이 작업을 수행하는 가장 복잡한 방법은 무엇입니까?

런타임에 네임 스페이스 매핑/정의를 "삽입"할 수 있습니까? 또는 바인딩 시간에 "전역 적으로"정의 할 수 있습니까?

+1

CSD와 XML 문서의 관련 부분을 게시하는 것이 좋습니다. JAXB un-marshalling에서 문제가되는 XSD를 따르지 않는 XML은 여전히 ​​유효합니다. XML이 실제로 XSD (예 : 온라인 유효성 검사 도구 사용)를 준수한다는 것을 확인한 경우 그렇게 말하여 SO 도우미가 방해하지 않도록하십시오. –

+0

좀 더 자세한 정보를 제공해야하는지 궁금했지만, 태블릿에서는 약간 어려웠습니다. 다음 번에는 실제 코드 입찰가를 제공 할 것입니다. 의견을 보내 주셔서 감사합니다. – raydogg

답변

2

가장 간단한 방법은 QName 대신 문자열을 사용하는 것입니다. javaType 맞춤 설정 to achieve this을 사용할 수 있습니다. 당신이 당신의 접두사를 고려할 것이라고 자신의 QName 컨버터를 제공 할 수있다, 위의

  • 유사 : 당신이 런타임에 접두사/네임 스페이스 매핑을 추가하려면

    은 그것을 할 꽤 몇 가지 방법이 있습니다.

  • 사이에 SAX 또는 StAX 필터를 넣고 startDocument에 추가 접두사를 선언 할 수 있습니다.
  • 실제로 접두사 매핑을 UnmarshallingContext.environmentNamespaceContext에 추가하면됩니다. 소스 코드를 확인했지만 직접 수행 할 수있는 쉬운 방법을 찾을 수 없었습니다.

저는 개인적으로 SAX/StAX 필터를 구현하여 이벤트 수준에서 XML을 "사전 처리"합니다.

+0

나는 당신의 제안을 받아 그것을 작동합니다. 기본적으로 내 자신의 XMLStreamReader를 구현하고 특정 문자열에 대한 응답을 평가했습니다. 이것은 유연성을 조금 제한하지만, 나는 날짜 공급자가 결국이 특정 문제를 조만간 해결할 것으로 기대하고 있습니다. – raydogg