Как упорядочить список в файл XML с помощью JAXB? - PullRequest
0 голосов
/ 06 января 2019

Глядя на маршалл и демаршалл объекты с 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);
    }

}

в контексте базы данных Customer в 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$ 

Однако, не смотря на то, что сейчас используется BaseX API, строго придерживайтесь JAXB для этого.

Просто хочу создать файл из нескольких Customer объектов, который хорошо сформирован. (Я не думаю, что это даже должно быть действительным.)

1 Ответ

0 голосов
/ 06 января 2019

Самое простое решение, которое я нашел на данный момент:

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

    }
}
...