unmarshaling всегда показывает 0 и ноль - PullRequest
0 голосов
/ 11 июня 2018

Я думаю, что лучший способ - это скопировать мой код, чтобы вы могли его понять.

Вот мои классы 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 и равен нулю?

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 и нулем.

Нет, мой вопрос не является дубликатом.Я не хочу иметь это как Элемент или показывать имя этого элемента в моем 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 голосов
/ 11 июня 2018

Если вы одержимы сохранением структуры 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...