【问题标题】:JAXB unmarshall issueJAXB 解组问题
【发布时间】:2017-12-21 18:09:29
【问题描述】:

我必须在 Java 对象中解析以下 xml:

<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 示例,我收到了字段翻译的 null。怎么了?

【问题讨论】:

    标签: java xml unmarshalling jaxb2


    【解决方案1】:

    感谢@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;
    
    
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用 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);
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2014-09-18
      • 2023-04-09
      • 2021-09-27
      相关资源
      最近更新 更多