简体   繁体   English

循环jaxb马歇尔

[英]loop a jaxb marshall

I simply want to loop a jaxb marshal with same xml element but with different ID, unlike my code below is parsing new xml file for each ID and write over the older one . 我只想循环使用相同xml元素但具有不同ID的jaxb marshal,不像我下面的代码解析每个ID的新xml文件并写入旧ID

data[][] is read in from a matrix, data[i][0] representing a list of ID, I want to set these id to customer 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);


      }

output from code above: 上面代码的输出:

<?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"/>

I want all the ID output in one single xml file , Any tips? 我想在一个单独的xml文件中输出所有ID,任何提示?

You can set the JAXB_FRAGMENT property on the Marshaller to prevent the header from being written out. 您可以在Marshaller上设置JAXB_FRAGMENT属性,以防止写出标头。 This is necessary when marshalling into another document. 在编组到另一个文档时,这是必要的。

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

}

System and File Output 系统和文件输出

Below is the resulting output to both the console and the file. 下面是控制台和文件的结果输出。

<?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>

For More Information 欲获得更多信息

Just move the construction of the marhsaller out of the loop. 只需将marhsaller的构造移出循环。 You can reuse the marshaller as many times as you want in the same thread. 您可以在同一个线程中多次重用marshaller。

Or are you really trying to output a list of customers as a single xml file? 或者您是否真的想要将客户列表输出为单个xml文件? Then you need an array of Customer objects, and then marshall the array. 然后,您需要一个Customer对象数组,然后对阵列进行编组。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM