簡體   English   中英

在XML文件中存儲多個對象

[英]storing multiple objects in XML file

我有一個簡單的java程序,將一個對象寫入xml文件,我的問題是,無論我怎么做,我都只能在xml文件中存儲1個對象。 我的代碼如下

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

    @XmlRootElement
    public class Product {

        String Name;
        int Price;

        @XmlElement
        public void setName(String Name) {
            this.Name = Name;
        }

        @XmlElement
        public void setPrice(int price) {
            this.price = price;
        }
    }
import xml.Product;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

    public class XML {


        public static void main(String[] args) {

            Product product=new Product();
            product.setName("Hamburger");
            product.setPrice(10);

            try{
                //File file = new File("C:\\file.xml");
                JAXBContext jaxbContext = JAXBContext.newInstance(Product.class);
                Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

                // output pretty printed
                jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

                jaxbMarshaller.marshal(product, file);
                jaxbMarshaller.marshal(product, System.out);
            }catch(JAXBException e){
                e.printStackTrace();
            } 

        }
        }

但是即使我實例化了2種產品,我在XML文件中也只能得到一個對象(該文件正確編寫)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Product>
     <Name>Hamburger</Name>
     <price>10</price>
</Product>

嗯,這有點像問是否已插入,但您的示例僅包含內容。 您需要某種清單。 將產品添加到列表中,然后序列化列表。

還要看一下XStream,您可以獲取它來為您完成xml位操作,而不必處理javax的東西。 它將為您與XML進行序列化。

您可以通過使用“產品列表”來解決此問題

編組產品清單

這是Product.java重構的

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "product")
@XmlAccessorType (XmlAccessType.FIELD)
public class Product {
    private String Name;
    private int price;

    public String getName() {
        return Name;
    }

    public int getPrice() {
        return price;
    }

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

    public void setPrice(int price) {
        this.price = price;
    }
}

現在創建一個具有列表類型字段的Products實體

import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "products")
@XmlAccessorType (XmlAccessType.FIELD)
public class Products {
    @XmlElement(name = "product")
    private List<Product> products = null;

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }
}

最后是一個演示:

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

public class ProductsDump {
    static Products products = new Products();
    static
    {
        products.setProducts(new ArrayList<>()); 
        Product prod1 = new Product();
        prod1.setName("Hamburger");
        prod1.setPrice(10);
        Product prod2 = new Product();
        prod2.setName("Bretzel");
        prod2.setPrice(5);
        products.getProducts().add(prod1);
        products.getProducts().add(prod2);
    }
    private static void marshalingExample() throws JAXBException
    {
        JAXBContext jaxbContext = JAXBContext.newInstance(Products.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        //Marshal the products list in console
        jaxbMarshaller.marshal(products, System.out);

        //Marshal the products list in file
        jaxbMarshaller.marshal(products, new File("c:/products.xml"));
    }

    public static void main(String[] args) throws Exception {
        marshalingExample();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM