Stax Создание файлов из большого XML-файла - добавление некоторой статической части в записанные файлы - PullRequest
0 голосов
/ 08 ноября 2018

Я довольно новичок в Stax, в настоящее время пытаюсь прочитать большой XML-файл, содержащий продукты, и буду записывать разные файлы продуктов в разные каталоги с помощью атрибута matnr, в настоящее время я действительно могу написать много документов, но я должен обогатить свой содержимое со статическими полями моего файла XML, содержимое моего файла:

<?xml version="1.0" encoding="UTF-8" ?>
<CMD>
<DOCUMENT_NUMBER>0363244</DOCUMENT_NUMBER>
<CREATE_TIME>20181106T125340</CREATE_TIME>
<PRODUCT matnr="material1" change_type="I">
<TABLE name="table1">
...
</TABLE>
<TABLE name="table2">
....
</TABLE>
</PRODUCT>
<PRODUCT matnr="material2" change_type="I">
<TABLE name="table1">
...
</TABLE>
<TABLE name="table2">
....
</TABLE>
</PRODUCT>
</CMD>

Мой код для записи файлов:

import java.io.File;
import java.io.FileReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;

public class Demo {
    public static String elementString = "";
    public static String staticString = "";
    public static void main(String[] args) throws Exception  {
        XMLInputFactory xif = XMLInputFactory.newInstance();
        XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml"));
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer t = tf.newTransformer();
        while(xsr.hasNext()) {
            int parseEvent = xsr.next();
            if (parseEvent == XMLStreamConstants.START_ELEMENT && "PRODUCT".equals(xsr.getLocalName())) {
                File file = new File("/xslt/templates/cmd-input-split/" + xsr.getAttributeValue(null, "matnr") + ".xml");
                //System.out.println(cmdStr + staticString + new StAXSource(xsr) + cmdEndStr);
                t.transform(new StAXSource(xsr), new StreamResult(file));
            }
        }
    }

В настоящее время записанные файлы начинаются с элемента similiar ниже

<?xml version="1.0" encoding="UTF-8" ?>
<PRODUCT matnr="material1" change_type="I">
<TABLE name="table1">
...
</TABLE>
<TABLE name="table2">
....
</TABLE>
</PRODUCT>

но мне нужно добавить некоторые элементы, которые существуют на входе, я должен прочитать два статических элемента файла с именами CREATE_TIME и DOCUMENT_NUMBER и добавить эти значения к каждому файлу, созданному с помощью преобразователя, в конце я хочу два файла из данного xml, как это:

material1.xml

<CMD>
<DOCUMENT_NUMBER>0363244</DOCUMENT_NUMBER>
<CREATE_TIME>20181106T125340</CREATE_TIME>
<PRODUCT matnr="material1" change_type="I">
<TABLE name="table1">
...
</TABLE>
<TABLE name="table2">
....
</TABLE>
</PRODUCT>
</CMD>

material2.xml

<CMD>
<DOCUMENT_NUMBER>0363244</DOCUMENT_NUMBER>
<CREATE_TIME>20181106T125340</CREATE_TIME>
<PRODUCT matnr="material2" change_type="I">
<TABLE name="table1">
...
</TABLE>
<TABLE name="table2">
....
</TABLE>
</PRODUCT>
</CMD>

Как я могу достичь своей цели, отредактировав реализацию, может кто-нибудь поддержать?

...