2017-12-21 21 views
0
내가 자바 객체에서 다음 XML을 구문 분석했습니다

: JAXB 비 정렬 화 문제

<ArrayOfTranslateArrayResponse xmlns="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<TranslateArrayResponse> 
    <From>it</From> 
    <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <a:int>5</a:int> 
    </OriginalTextSentenceLengths> 
    <TranslatedText>Mom</TranslatedText> 
    <TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <a:int>3</a:int> 
    </TranslatedTextSentenceLengths> 
</TranslateArrayResponse> 
<TranslateArrayResponse> 
    <From>it</From> 
    <OriginalTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <a:int>4</a:int> 
    </OriginalTextSentenceLengths> 
    <TranslatedText>Dad</TranslatedText> 
    <TranslatedTextSentenceLengths xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"> 
     <a:int>3</a:int> 
    </TranslatedTextSentenceLengths> 
</TranslateArrayResponse> 

내가 구현 한이 두 클래스 :

@XmlRootElement(name="ArrayOfTranslateArrayResponse") 
@XmlAccessorType(XmlAccessType.FIELD) 
@Getter 
@Setter 
@ToString 
public class TranslateResponse { 

    @XmlElement(name="TranslateArrayResponse") 
    private LinkedList<TranslatedResponseObject> translations; 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@Getter 
@Setter 
@ToString 
public class TranslatedResponseObject { 

    @XmlElement(name="TranslatedText") 
    private String translatedText; 


} 

XML 예제의 unmarshall을 사용하여 필드 변환에 null을 받았습니다. 뭐가 잘못 되었 니?

답변

0

ValidationEventHandler를 사용하여 문제를 디버깅 할 수 있습니다.

public class MyValidationEventHandler implements ValidationEventHandler { 

    @Override 
    public boolean handleEvent(ValidationEvent event) { 

     switch (event.getSeverity()) { 

      case ValidationEvent.WARNING: 
      case ValidationEvent.ERROR: 
      case ValidationEvent.FATAL_ERROR: { 
       log.error("Validation event : {} in {} line {} col {}", 
          event.getMessage(), 
          event.getLocator().getURL(), 
          event.getLocator().getLineNumber(), 
          event.getLocator().getColumnNumber()); 
       return false; 
      } 
      default: 
       return true; 
     } 
    } 
} 

는 그리고 당신은 다음과 같이 사용 :

final JAXBContext jAXBContext = JAXBContext.newInstance(target); 
final Unmarshaller unmarshaller = jAXBContext.createUnmarshaller(); 

unmarshaller.setEventHandler(new MyValidationEventHandler()); 

unmarshaller.unmarshal(file); 
+0

제안 해 주셔서 감사합니다. 여기 오류 : javax.xml.bind.UnmarshalException : 예상치 못한 요소 (uri : "http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2", 로컬 : "ArrayOfTranslateArrayResponse"). 예상되는 요소는 <{} ArrayOfTranslateArrayResponse>, <{} TranslateArrayRequest> –

0

내가 솔루션을 가지고, 감사를 @klonq 제안에 문제를 디버깅 할 수 있습니다. 다음과 같이 각 @XmlElement 및 @XmlRootElement에 네임 스페이스를 추가해야했습니다.

@XmlRootElement(name="ArrayOfTranslateArrayResponse", namespace="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2") 
@XmlAccessorType(XmlAccessType.FIELD) 
@Getter 
@Setter 
@ToString 
public class TranslateResponse { 

    @XmlElement(name="TranslateArrayResponse", namespace="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2") 
    private LinkedList<TranslatedResponseObject> translations; 

} 

@XmlAccessorType(XmlAccessType.FIELD) 
@Getter 
@Setter 
@ToString 
public class TranslatedResponseObject { 

    @XmlElement(name="TranslatedText", namespace="http://schemas.datacontract.org/2004/07/Microsoft.MT.Web.Service.V2") 
    private String translatedText; 


}