使用XML
查找marshall和unmarshall对象。
对{strong>一个客户的罚款is是这样创建的:
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
对象的文件 即可,该文件格式正确。 (我认为这甚至没有必要。)
答案 0 :(得分:0)
到目前为止,我found的“最简单”解决方案:
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();
}
}
}