Рубрики
Без рубрики

Как написать XML-файл на Java (STAX Writer)

java – Как написать XML-файл на Java (STAX Writer)

Автор оригинала: mkyong.

В этом руководстве показано, как использовать API Streaming для XML (STAX) writer для записи данных в XML-файл.

Содержание

  • 1. Запись в XML (API-интерфейсы Stax Writer)
  • 2. Запись в XML (API курсора STAX – XMLStreamWriter)
  • 3. Запись в XML (API итератора STAX – XMLEventWriter)
  • 4. Запись и красивая печать XML-содержимого (трансформатор)
  • 5. Скачать Исходный Код
  • 6. Рекомендации

Примечание |/Как читать XML-файл на Java (анализатор Stax)

P.S Все приведенные ниже примеры протестированы с Java 11.

1. Запись в XML (API-интерфейсы Stax Writer)

В потоковом API для XML (STAX) мы можем использовать API курсора StAX или API итератора StAX для записи данных в XML-файл.

1.1 Ниже приведен API курсора StAX записи данных в XML.

  XMLOutputFactory output = XMLOutputFactory.newInstance();

  XMLStreamWriter writer = output.createXMLStreamWriter(
                              new FileOutputStream("/path/test.xml"));

  writer.writeStartDocument();

  writer.writeStartElement("test");

  // write other XML elements

  writer.writeEndDocument();

  writer.flush();

  writer.close();

1.2 Ниже приведен API итератора StAX для записи данных в XML.

  XMLOutputFactory output = XMLOutputFactory.newInstance();

  XMLEventFactory eventFactory = XMLEventFactory.newInstance();

  XMLEventWriter writer = output.createXMLEventWriter(
                            new FileOutputStream("/path/test.xml"));

  XMLEvent event = eventFactory.createStartDocument();
  writer.add(event);

  // add other xml events

  writer.add(eventFactory.createEndDocument());

  writer.flush();

  writer.close();        

2. Запись в XML (API курсора STAX – XMLStreamWriter)

В приведенном ниже примере используется API курсора STAX XMLStreamWriter для записи данных в XML-файл.

package com.mkyong.xml.stax;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class WriteXmlStAXCursor {

    public static void main(String[] args) throws XMLStreamException {

        // send the output to a xml file
        try(FileOutputStream out = new FileOutputStream("/home/mkyong/test.xml")){
            writeXml(out);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // send the output to System.out
        // writeXml(System.out);

    }

    // StAX Cursor API
    private static void writeXml(OutputStream out) throws XMLStreamException {

        XMLOutputFactory output = XMLOutputFactory.newInstance();

        XMLStreamWriter writer = output.createXMLStreamWriter(out);

        writer.writeStartDocument("utf-8", "1.0");

        // 
        writer.writeStartElement("company");

        // 

        // add XML comment
        writer.writeComment("This is Staff 1001");

        writer.writeStartElement("staff");
        writer.writeAttribute("id", "1001");

        writer.writeStartElement("name");
        writer.writeCharacters("mkyong");
        writer.writeEndElement();

        writer.writeStartElement("salary");
        writer.writeAttribute("currency", "USD");
        writer.writeCharacters("5000");
        writer.writeEndElement();

        writer.writeStartElement("bio");
        writer.writeCData("HTML tag testing");
        writer.writeEndElement();

        writer.writeEndElement();
        // 

        // 
        writer.writeStartElement("staff");
        writer.writeAttribute("id", "1002");

        writer.writeStartElement("name");
        writer.writeCharacters("yflow");
        writer.writeEndElement();

        writer.writeStartElement("salary");
        writer.writeAttribute("currency", "EUR");
        writer.writeCharacters("8000");
        writer.writeEndElement();

        writer.writeStartElement("bio");
        writer.writeCData("a & b");
        writer.writeEndElement();

        writer.writeEndElement();
        // 

        writer.writeEndDocument();
        // 

        writer.flush();

        writer.close();

    }

}

XMLStreamWriter записывает данные в XML-файл в компактном режиме, и позже мы будем использовать Трансформатор в довольно – распечатайте XML содержимое.


mkyong5000

yflow8000

3. Запись в XML (API итератора STAX – XMLEventWriter)

В приведенном ниже примере используется API итератора STAX XMLEventWriter для записи данных в XML-файл.

package com.mkyong.xml.stax;

import javax.xml.stream.*;
import javax.xml.stream.events.XMLEvent;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class WriteXmlStAXIterator {

    public static void main(String[] args) throws XMLStreamException {

        // send the output to a xml file
        try(FileOutputStream out = new FileOutputStream("/home/mkyong/test.xml")){
            writeXml2(out);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // send the output to System.out
        // writeXml2(System.out);

    }

    // StAX Iterator API
    private static void writeXml2(OutputStream out) throws XMLStreamException {

        XMLOutputFactory output = XMLOutputFactory.newInstance();
        XMLEventFactory eventFactory = XMLEventFactory.newInstance();

        // StAX Iterator API
        XMLEventWriter writer = output.createXMLEventWriter(out);

        XMLEvent event = eventFactory.createStartDocument();
        // default
        //event = eventFactory.createStartDocument("utf-8", "1.0");
        writer.add(event);

        writer.add(eventFactory.createStartElement("", "", "company"));

        // write XML comment
        writer.add(eventFactory.createComment("This is staff 1001"));

        writer.add(eventFactory.createStartElement("", "", "staff"));
        // write XML attribute
        writer.add(eventFactory.createAttribute("id", "1001"));

        writer.add(eventFactory.createStartElement("", "", "name"));
        writer.add(eventFactory.createCharacters("mkyong"));
        writer.add(eventFactory.createEndElement("", "", "name"));

        writer.add(eventFactory.createStartElement("", "", "salary"));
        writer.add(eventFactory.createAttribute("currency", "USD"));
        writer.add(eventFactory.createCharacters("5000"));
        writer.add(eventFactory.createEndElement("", "", "salary"));

        writer.add(eventFactory.createStartElement("", "", "bio"));
        // write XML CData
        writer.add(eventFactory.createCData("HTML tag testing"));
        writer.add(eventFactory.createEndElement("", "", "bio"));

        // 
        writer.add(eventFactory.createEndElement("", "", "staff"));

        // next staff, tired to write more
        // writer.add(eventFactory.createStartElement("", "", "staff"));
        // writer.add(eventFactory.createAttribute("id", "1002"));
        // writer.add(eventFactory.createEndElement("", "", "staff"));

        // end here.
        writer.add(eventFactory.createEndDocument());

        writer.flush();

        writer.close();

    }

}

Выход


mkyong
5000


4. Запись и красивая печать XML-содержимого (трансформатор)

4.1 В приведенных ниже фрагментах кода используется javax.xml.transform. Трансформатор для красивой печати XML-содержимого.

  private static String formatXML(String xml) throws TransformerException {

      // write data to xml file
      TransformerFactory transformerFactory = TransformerFactory.newInstance();

      Transformer transformer = transformerFactory.newTransformer();

      // alternative
      //Transformer transformer = SAXTransformerFactory.newInstance().newTransformer();

      // pretty print by indention
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");

      // add standalone="yes", add line break before the root element
      transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");

      /*transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC,
              "-//W3C//DTD XHTML 1.0 Transitional//EN");

      transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM,
              "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd");*/

      // ignore 
      //transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");

      StreamSource source = new StreamSource(new StringReader(xml));
      StringWriter output = new StringWriter();
      transformer.transform(source, new StreamResult(output));

      return output.toString();

  }

4.2 Шаги по распечатке XML-содержимого.

  1. Запишите данные в переменную ByteArrayOutputStream .
  2. Преобразуйте переменную ByteArrayOutputStream в строку.
  3. Transformer чтобы красиво распечатать строку и вернуть форматированную строку XML.
  4. Сохраните отформатированную строку XML в файл.

Приведенный ниже пример позволяет распечатать XML-содержимое и записать его в XML-файл.

package com.mkyong.xml.stax;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class WriteXmlStAXPrettyPrint {

    public static void main(String[] args) {

        try {

            ByteArrayOutputStream out = new ByteArrayOutputStream();
            // write XML to ByteArrayOutputStream
            writeXml(out);

            // Java 10
            //String xml = out.toString(StandardCharsets.UTF_8);

            // standard way to convert byte array to String
            String xml = new String(out.toByteArray(), StandardCharsets.UTF_8);

            // System.out.println(formatXML(xml));

            String prettyPrintXML = formatXML(xml);

            // print to console
            // System.out.println(prettyPrintXML);

            // Java 11 - write to file
            Files.writeString(Paths.get("/home/mkyong/test.xml"),
                    prettyPrintXML, StandardCharsets.UTF_8);

            // Java 7 - write to file
            //Files.write(Paths.get("/home/mkyong/test.xml"),
            //    prettyPrintXML.getBytes(StandardCharsets.UTF_8));

            // BufferedWriter - write to file
            /*try (FileWriter writer = new FileWriter("/home/mkyong/test.xml");
                 BufferedWriter bw = new BufferedWriter(writer)) {
                bw.write(xml);
            } catch (IOException e) {
                e.printStackTrace();
            }*/

        } catch (TransformerException | XMLStreamException | IOException e) {
            e.printStackTrace();
        }

    }

    // StAX Cursor API
    private static void writeXml(OutputStream out) throws XMLStreamException {

        XMLOutputFactory output = XMLOutputFactory.newInstance();

        XMLStreamWriter writer = output.createXMLStreamWriter(out);

        writer.writeStartDocument("utf-8", "1.0");

        // 
        writer.writeStartElement("company");

        // 
        // add XML comment
        writer.writeComment("This is Staff 1001");

        writer.writeStartElement("staff");
        writer.writeAttribute("id", "1001");

        writer.writeStartElement("name");
        writer.writeCharacters("mkyong");
        writer.writeEndElement();

        writer.writeStartElement("salary");
        writer.writeAttribute("currency", "USD");
        writer.writeCharacters("5000");
        writer.writeEndElement();

        writer.writeStartElement("bio");
        writer.writeCData("HTML tag testing");
        writer.writeEndElement();

        writer.writeEndElement();
        // 

        // 
        writer.writeStartElement("staff");
        writer.writeAttribute("id", "1002");

        writer.writeStartElement("name");
        writer.writeCharacters("yflow");
        writer.writeEndElement();

        writer.writeStartElement("salary");
        writer.writeAttribute("currency", "EUR");
        writer.writeCharacters("8000");
        writer.writeEndElement();

        writer.writeStartElement("bio");
        writer.writeCData("a & b");
        writer.writeEndElement();

        writer.writeEndElement();
        // 

        writer.writeEndDocument();
        // 

        writer.flush();

        writer.close();

    }

    private static String formatXML(String xml) throws TransformerException {

        // write data to xml file
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();

        // pretty print by indention
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");

        // add standalone="yes", add line break before the root element
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");

        StreamSource source = new StreamSource(new StringReader(xml));
        StringWriter output = new StringWriter();
        transformer.transform(source, new StreamResult(output));

        return output.toString();

    }

}

Выход



    
    
        mkyong
        5000
        
            
    
    
        yflow
        8000
        
            
    

Преобразование XML в объекты Java Попробуйте Jakarta XML Binding (JAXB) преобразовать XML в/из объектов Java.

5. Скачать Исходный Код

$клон git $клон git

$компакт-диск java-xml

$cd src/основной/java/com/mkyong/xml/stax$cd src/основной/java/com/mkyong/xml/stax/

6. Рекомендации

Оригинал: “https://mkyong.com/java/how-to-write-xml-file-in-java-stax-writer/”