XML 使用 JAXB 进行对象解组

XML to Object Unmarshalling using JAXB

我需要将 XML 解组为 Java 对象,我已尝试使用以下代码。它创建一个对象但将所有值设置为空。相同的代码:

 @XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Dispatch implements java.io.Serializable {
    private Integer dispatchId;
    private Order order;

    /**
     * @return the dispatchId
     */
    public Integer getDispatchId() {
        return dispatchId;
    }

    /**
     * @param dispatchId
     *            the dispatchId to set
     */
    public void setDispatchId(Integer dispatchId) {
        this.dispatchId = dispatchId;
    }

    /**
     * @return the order
     */
    public Order getOrder() {
        return order;
    }

    /**
     * @param order
     *            the order to set
     */
    public void setOrder(Order order) {
        this.order = order;
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return ""+this.dispatchId;
    }
}

我有 Dispatch Class 和其他子 class,我需要将 XML 转换为 Java 对象。相同的代码:

Public class UnmarshalExample {
    public static void main(String[] args) {
        String xmlString = "<ns1:dispatch xmlns:ns1=\"http://service.order.com\"><ns1:dispatchId>1</ns1:dispatchId><ns1:order><ns1:totalAmount>1000.0</ns1:totalAmount></ns1:order></ns1:dispatch>";

        Dispatch dispatch = (Dispatch) JAXB.unmarshal(
                new StringReader(xmlString), Dispatch.class);

        System.out.println(dispatch);
    }

}

作为输出,它将return null

任何人都可以告诉我我的代码有什么问题吗?

这很奇怪,我粘贴了你的代码 运行 并且它生成了 dispatchId 1:

调度class:

import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Dispatch implements java.io.Serializable {
   private static final long serialVersionUID = 1L;
    private Integer dispatchId;

   /**
    * @return the dispatchId
    */
   public Integer getDispatchId() {
       return dispatchId;
   }

   /**
    * @param dispatchId
    *            the dispatchId to set
    */
   public void setDispatchId(Integer dispatchId) {
       this.dispatchId = dispatchId;
   }

   @Override
   public String toString() {
       // TODO Auto-generated method stub
       return ""+this.dispatchId;
   }
}

测试class

import java.io.*;
import javax.xml.bind.JAXB;

public class Test {

  public static void main(String[] args) {
    String xmlString = "<ns1:dispatch xmlns:ns1=\"http://service.order.com\"><ns1:dispatchId>1</ns1:dispatchId><ns1:order><ns1:totalAmount>1000.0</ns1:totalAmount></ns1:order></ns1:dispatch>";

    Dispatch dispatch = (Dispatch) JAXB.unmarshal(
            new StringReader(xmlString), Dispatch.class);

    System.out.println(dispatch);
  }
}

输出是

1

订单类型为订单。我们没有看到此 class 的任何代码。 这可能也是它的原因。您可能没有为要构建的订单提供像样的数据。

查看名称空间的使用方式:http://blog.bdoughan.com/2012/11/applying-namespace-during-jaxb-unmarshal.html