java - 如何使用 JAXB 将列表编组为 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 的数据库的上下文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$
但是,目前不打算使用API,为此BaseX
严格遵守。JAXB
只是想建立一个格式良好的多个Customer
对象的文件。(我认为它甚至不必是有效的。)
解决方案
到目前为止我发现的“最简单”的解决方案:
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();
}
}
}
推荐阅读
- node.js - 创建后,travis ci 中不存在 Postgresql 数据库
- django - Django 随机对象并在模板中使用
- angularjs - 错误:ng:areq Bad Argument paidCtrl 不是函数,未定义
- javascript - JSDom 11.12.0 - 如何模拟 localStorage?
- ajax - f:ajax 仍然刷新整个页面
- java - 在 android 4.1 上无法获取 menuitem,它崩溃了
- javascript - javascript - 在按钮单击时复制 div
- android - 未从回调方法更新视图
- python - 如何在keras中正确使用numpy
- c# - Acumatica:能够覆盖 DefaultEndpointImpl 以向合同 REST API 添加高级自定义逻辑