2017-12-21 8 views
0
私はJavaオブジェクトに次の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> 

私が実装しました。この2クラス:

@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; 


} 
関連する問題