2016-10-25 1 views
0

은 내가XSD를 건너 뛰는 방법 : 언 마샬링 중 입력 하시겠습니까?

내가 그것을 비 정렬 화하려는
<?xml version="1.0" encoding="UTF-8"?> 
<ns1:paymentResponse xmlns:ns1="urn:Brifastservice"> 
    <return xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="tns:paymentAccount_CT_Result"> 
     <message xsi:type="xsd:string">[ERROR] Reference Number Same </message> 
     <status xsi:type="xsd:string">2007</status> 
    </return> 
</ns1:paymentResponse> 

, 난 코드

JAXBContext jaxbContext = JAXBContext.newInstance(PaymentResponse.class); 
Unmarshaller um = jaxbContext.createUnmarshaller(); 

StringReader resRreader = new StringReader(res); 

final SAXParserFactory sax = SAXParserFactory.newInstance(); 
sax.setNamespaceAware(true); 
final XMLReader reader = sax.newSAXParser().getXMLReader(); 
final Source er = new SAXSource(reader, new InputSource(resRreader)); 

PaymentResponse response = (PaymentResponse)um.unmarshal(er); 
return response.getReturnResponse().getMessage(); 

이하로 사용하고 XML을 받았지만 나는

접두사 XSD가 네임 스페이스에 바인드되지 않은 예외를 얻었다

sax.setNamespaceAware(false); 

는 내가

javax.xml.bind.UnmarshalException: 
    unexpected element (uri:"", local:"ns1:paymentResponse"). 
    Expected elements are <{urn:someService}paymentResponse> 

을 얻을 방법을 비 정렬 화하는 것이 좋습니다하세요? 나는

@javax.xml.bind.annotation.XmlSchema(
    namespace = "urn:someService", 
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED) 

답변

1

XML 문서가 요소의 XSD 유형을 선언 XSI를 사용하지만 XSD 네임 스페이스는이 문서의 아무 곳이나 정의되지 않은 패키지 정보가 있습니다.

신속하고 더러운 해결책은 수신 된 XML 문서로 문자열을 수정하고 구문 분석하기 전에 루트 요소에 xmlns:xsd="http://www.w3.org/2001/XMLSchema" 선언을 강제로 추가하는 것입니다.

적절한 soluction가 선언 된 네임 스페이스를 추적하고 또한 누락 된 XSD 네임 스페이스를 주입하는 NamespaceSupport 객체의 사용을 startDocument, endDocument, startPrefixMappingendPrefixMapping 이벤트를 차단하고 만드는 사용자 정의의 ContentHandler를 만드는 것입니다. 이 예제 (삽입 된 네임 스페이스 빼기)는 네임 스페이스 매핑 받기XML 처리 코드 (http://www.cafeconleche.org/books/xmljava/chapters/ch06s09.html에서 사용 가능)에서 찾을 수 있습니다.

관련 문제