首页 > 解决方案 > 如何使用 JAXB 将列表编组为 XML 文件?

问题描述

期待用. _ _ _XML

这对一个客户来说很好,它被创建为:

thufir@dur:~/jaxb$ 
thufir@dur:~/jaxb$ ls
jaxbexample.xml
thufir@dur:~/jaxb$ 
thufir@dur:~/jaxb$ cat jaxbexample.xml 
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="0">
    <age>44</age>
    <name>mkyong</name>
</customer>
thufir@dur:~/jaxb$ 

如何创建List对象Customer并将其写入xml文件?

package helloWorldSaxon;

import java.io.File;
import java.util.List;
import java.util.logging.Logger;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.Result;
import javax.xml.transform.dom.DOMResult;

//https://stackoverflow.com/q/17059227/262852

public class JaxBExample {

    private static final Logger LOG = Logger.getLogger(JaxBExample.class.getName());
    private String pathToFile = "/home/thufir/jaxb/jaxbexample.xml";
    private int id = 0;

    public JaxBExample() {
    }

    public Customer readCustomerFromFile() throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File(pathToFile);
        Customer customer = (Customer) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(Marshaller.JAXB_NO_NAMESPACE_SCHEMA_LOCATION, "/tmp/bla-bla.xsd"); //???
        Result result = new DOMResult();  //what to do with result?? nothing?
        marshaller.marshal(customer, result);
        return customer;
    }

    public Customer dummyCustomer() throws Exception {
        Customer customer = new Customer();
        customer.setId(id);
        customer.setName("mkyong");
        customer.setAge((int) (Math.random() * 100));
        id++;
        return customer;
    }

    public void writeCustomersTofile(List<Customer> customers) {
        //new file, overwrite old file.
        //write a collection to the file
        //so that each customer can then be read in.
        //import to basex
    }

    public void writeCustomerToFile(Customer customer) throws Exception {
        File file = new File(pathToFile);
        JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
        Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        jaxbMarshaller.marshal(customer, file);
    }

}

在 in 的数据库的上下文CustomerBaseX

thufir@dur:~/jaxb$ 
thufir@dur:~/jaxb$ basex
[warning] /usr/bin/basex: Unable to locate /usr/share/java/jing.jar in /usr/share/java
BaseX 9.0.1 [Standalone]
Try 'help' to get more information.
> 
> CREATE DB customers jaxbexample.xml
Database 'customers' created in 367.3 ms.
> 
> XQUERY /
<customer id="0">
  <age>44</age>
  <name>mkyong</name>
</customer>
Query executed in 213.83 ms.
> 
> exit
Enjoy life.
thufir@dur:~/jaxb$ 

但是,目前不打算使用API,为此BaseX严格遵守。JAXB

只是想建立一个格式良好多个Customer对象的文件。(我认为它甚至不必是有效的。)

标签: javaxmljaxbmarshallingbasex

解决方案


到目前为止我发现的“最简单”的解决方案:

package com.danibuiza.jaxb.ultimate.marshal;

import java.io.File;
import java.time.LocalDate;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;

import com.danibuiza.jaxb.ultimate.business.Countries;
import com.danibuiza.jaxb.ultimate.business.Country;



/**
 * Simple example of usage of jaxb marshaling functionalities showing how to manage lists
 * 
 * @author dgutierrez-diez
 */
public class JaxBExampleList
{

    public static void main( String[] args )
    {
        try
        {

            /* init a list with a couple of countries to marshal */
            Country spain = new Country();
            spain.setName( "Spain" );
            spain.setCapital( "Madrid" );
            spain.setContinent( "Europe" );

            spain.setFoundation( LocalDate.of( 1469, 10, 19 ) );

            Country usa = new Country();
            usa.setName( "USA" );
            usa.setCapital( "Washington" );
            usa.setContinent( "America" );


            usa.setFoundation( LocalDate.of( 1776, 7, 4 ) );

            Countries countries = new Countries();
            countries.add( spain );
            countries.add( usa );

            /* init jaxb marshaler */
            JAXBContext jaxbContext = JAXBContext.newInstance( Countries.class );
            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();

            /* set this flag to true to format the output */
            jaxbMarshaller.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, true );

            /* marshaling of java objects in xml (output to file and standard output) */
            jaxbMarshaller.marshal( countries, new File( "list_countries.xml" ) );
            jaxbMarshaller.marshal( countries, System.out );

        }
        catch( JAXBException e )
        {
            e.printStackTrace();
        }

    }
}

推荐阅读