unmarshaling总是显示0和null

时间:2018-06-11 10:36:00

标签: java jaxb

我认为最好的方法是复制我的代码,以便您能够理解它。

以下是我的POJO课程:

import javax.xml.bind.annotation.XmlAttribute;

public class Product {

    private String name;

    public Product() {
    }

    public Product(String name) {
        this.name = name;
    }

    @XmlAttribute(name = "productName")
    public String getProduct() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}


import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="ShoppingCart")

public class Cart {

    private List<Product> productList = new ArrayList<>();
    private long CartIdentifier;

    public Cart() {

    }
    public Cart(long id) {
        this.CartIdentifier=id;
    }

    @XmlAttribute(name="CartIdentifier")
    public long getId() {
        return  CartIdentifier;
    }

    public void setType(long id) {
        this.CartIdentifier=id;
    }

    public Cart(List<Product> list) {
        this.productList = list;
    }

    public void addElement(Product element) {
        this.productList.add(element);
    }
    @XmlElement(name = "CurrentProducts")
    public List<Product> getCart() {
        return this.productList;
    }

    public void setCart(List<Product> cart) {
        this.productList = cart;
    }

}

import java.util.ArrayList;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "CashRegister")
public class Register {
    @XmlElement(name = "ShoppingCart")
    private ArrayList<Cart> listCart;

    long CartIdentifier;

    public Register() {

    }

    public Register(long id) {
        this.CartIdentifier=id;
    }
    public long getId() {
        return  CartIdentifier;
    }

    public void addElementforBonus(Cart element) {
        listCart.add(element);
    }

    public void setType(long id) {
        this. CartIdentifier=id;
    }

    public void setList(ArrayList<Cart> list) {
        this.listCart = list;
    }

    public ArrayList<Cart> getCartList() {
        return listCart;
    }

}

所以这些是我的POJO类,主要是它们创建了完美的XML,但是当涉及到从XML转换为正常输出时出现问题。有人能告诉我我在哪里犯了错误,为什么我的输出总是比0和null?

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Main {

    public static void main(String[] args) throws JAXBException, IOException {

        ArrayList<Cart> list = new ArrayList<Cart>();

        Register store = new Register(1);
        store.setType(1);
        store.setList(list);

        Product first = new Product("Burger");
        Product second = new Product("Banana");

        Cart cart1 = new Cart(1);
        cart1.setType(1);
        cart1.addElement(first);
        cart1.addElement(second);
        store.getCartList().add(cart1);


        // create JAXB context and instantiate marshaller
        JAXBContext context = JAXBContext.newInstance(Register.class);
        Marshaller m = context.createMarshaller();
        m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        // Write to System.out
        m.marshal(store, System.out);


            m.marshal(store, new File("mrs.xml"));

            System.out.println("Output from our XML File: ");
            Unmarshaller um = context.createUnmarshaller();
            Register reg = (Register) um.unmarshal(new FileReader("mrs.xml"));
            ArrayList<Cart> list1 = reg.getCartList();
            for(Cart x:reg.getCartList()) {
                System.out.println(x.getId());
            }
            for (Cart cart : list1) {
                System.out.println("Cart: " + cart.getId());
                for(Product product : cart.getCart()) {
                     System.out.println("Product: " + product.getProduct());
                }
            }


        }



}

所以这是我的输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CashRegister>
    <ShoppingCart CartIdentifier="1">
        <CurrentProducts productName="Burger"/>
        <CurrentProducts productName="Banana"/>
    </ShoppingCart>
</CashRegister>
Output from our XML File: 
0
Cart: 0
Product: null
Product: null

有一个购物车有两个产品,但没有0和null。

不,我的问题不重复。我不希望将其作为元素或在我的xml中显示该元素的名称。我的xml看起来很完美,但我无法解组它

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<CashRegister>
    <ShoppingCart CartIdentifier="1">
        <CurrentProducts productName="Burger"/>
        <CurrentProducts productName="Banana"/>
    </ShoppingCart>
</CashRegister>
Output from our XML File: 
Exception in thread "main" java.lang.ClassCastException: bonusxml.Register cannot be cast to bonusxml.Register1
    at bonusxml.Main.main(Main.java:45)

1 个答案:

答案 0 :(得分:0)

如果你一直在努力保留你的XML结构,你将不得不为此付出代价。下面是可以让您反序列化您创建的XML的类。但是,您最终将使用两组不同的类进行序列化和反序列化。

<强> Cart.java

@XmlRootElement(name="ShoppingCart")
public class Cart1 {

    @XmlElement(name = "CurrentProducts")
    private List<Product1> productList = new ArrayList<>();
    @XmlAttribute(name="CartIdentifier")
    private long CartIdentifier;

    public Cart1() {}

    public Cart1(long id) {
        this.CartIdentifier=id;
    }
    // setters & getters
}

<强> Product.java

public class Product1 {

    @XmlAttribute(name = "productName")
    private String name;

    public Product1() {
    }

    public Product1(String name) {
    this.name = name;
    }
    // setters & getters
}

<强> Register.java

@XmlRootElement(name = "CashRegister")
public class Register1 {

    @XmlElement(name = "ShoppingCart")
    private ArrayList<Cart1> listCart;

    long CartIdentifier;

    public Register1() {

    }

    public Register1(long id) {
        this.CartIdentifier=id;
    }
    //setters & getters
}