Автор оригинала: 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"); // writer.flush(); writer.close(); } }// 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(); //
XMLStreamWriter
записывает данные в XML-файл в компактном режиме, и позже мы будем использовать Трансформатор
в довольно – распечатайте XML содержимое.
mkyong 5000 yflow 8000
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-содержимого.
- Запишите данные в переменную
ByteArrayOutputStream
. - Преобразуйте переменную
ByteArrayOutputStream
в строку. Transformer
чтобы красиво распечатать строку и вернуть форматированную строку XML.- Сохраните отформатированную строку 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"); // 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(); } }// 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(); //
Выход
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. Рекомендации
- Википедия – Java API для обработки XML
- Потоковый API для XML (STAX)
- Введение в StAX
- Как читать XML-файл на Java (анализатор Stax)
- Как читать XML–файл на Java – (DOM-анализатор)
- Как читать XML–файл на Java – (синтаксический анализатор SAX)
- Как читать XML–файл на Java – (синтаксический анализатор JDOM)
- Пример JAXB привет, мир
- Java – Как сохранить строку в файл
- Часто задаваемые вопросы по Apache Xerces
Оригинал: “https://mkyong.com/java/how-to-write-xml-file-in-java-stax-writer/”