我只想循环使用相同xml元素但具有不同ID的jaxb marshal,不像我下面的代码解析每个ID的新xml文件并覆盖旧ID 。
data [] []从矩阵中读入,data [i] [0]表示ID列表,我想将这些id设置为客户ID。
Customer customer = new Customer();
File file = new File("C:/data.xml");
for (int i = 0; i < data.length; i++) {
customer.setId(data[i][0]);
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(customer, file);
jaxbMarshaller.marshal(customer, System.out);
}
以上代码的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="1"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="2"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="3"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="4"/>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<customer id="5"/>
我希望所有ID 输出都在一个xml文件中,有什么提示吗?
答案 0 :(得分:2)
您可以在JAXB_FRAGMENT
上设置Marshaller
属性,以防止标头被写出。在编组到另一个文档时,这是必要的。
package forum12925616;
import java.io.*;
import javax.xml.bind.*;
public class Demo {
private static int X = 5;
private static int Y = 2;
public static void main(String[] args) throws Exception {
int[][] data = new int[X][Y];
for (int x = 0; x < X; x++) {
for (int y = 0; y < Y; y++) {
data[x][y] = x;
}
}
// Create this once
JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
marshal(jaxbMarshaller, data, System.out);
FileOutputStream fileOutputStream = new FileOutputStream("src/forum12925616/out.xml");
marshal(jaxbMarshaller, data, fileOutputStream);
fileOutputStream.close();
}
private static void marshal(Marshaller jaxbMarshaller, int[][] data, OutputStream outputStream) throws Exception {
OutputStreamWriter writer = new OutputStreamWriter(outputStream);
writer.write("<?xml version='1.0' encoding='UTF-8' standalone='yes'?>");
writer.write("\n<customers>\n");
for (int i = 0; i < data.length; i++) {
Customer customer = new Customer();
customer.setId(data[i][0]);
jaxbMarshaller.marshal(customer, writer);
writer.write("\n");
}
writer.write("<customers>");
writer.flush();
}
}
系统和文件输出
以下是控制台和文件的结果输出。
<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<customers>
<customer id="0"/>
<customer id="1"/>
<customer id="2"/>
<customer id="3"/>
<customer id="4"/>
<customers>
了解更多信息
答案 1 :(得分:1)
将marhsaller的构造移出循环。您可以在同一个线程中多次重用marshaller。
或者您是否真的想要将客户列表输出为单个xml文件?然后,您需要一个Customer对象数组,然后对该数组进行编组。