0

Looking to marshall and unmarshall objects with XML.

This is fine for one customer, which is created as:

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$ 

How do I go about creating a List of Customer objects and write those to an xml file?

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 the context of a database of Customer in BaseX:

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$ 

However, not looking to use the BaseX API at the moment, strictly staying with JAXB for this.

Just looking to build a file of multiple Customer objects which is well formed. (I don't think it even has to be valid.)

Thufir
  • 8,216
  • 28
  • 125
  • 273
  • 1
    Actually this is not a JAXB or BaseX question. Rather, it is a XML question regarding the XML root element, see https://en.wikipedia.org/wiki/Root_element Because there must be one and only one root element, it is necessary to store the list of customers into an container element, i.e. customers. – Michal Jan 06 '19 at 08:10

1 Answers1

0

The "simplest" solution I found so far:

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();
        }

    }
}
Thufir
  • 8,216
  • 28
  • 125
  • 273