XML EventWriter в Java StAX
Java StAX API также называется Java Streaming API для XML , и он был представлен в Java 6. Это наиболее востребованный API при рассмотрении парсеров DOM и SAX. StAX состоит из API на основе курсора и API на основе итератора. В этой статье давайте посмотрим, как подготовить файл XML в java с помощью API на основе StAX Iterator (XMLEventWriter). Для создания XML-структуры нам особенно нужно увидеть несколько важных методов XMLEventWriter. XMLEventWriter — это интерфейс верхнего уровня для написания XML-документов.
Методы | Описание |
|---|---|
| недействительное добавление (событие XMLEvent) | Это запустит добавление события в выходной поток. Добавление START_ELEMENT поможет открыть новую область пространства имен. Заканчивая с помощью END_ELEMENT, элемент записывается, а теги закрываются. |
| void add (читатель XMLEventReader) | В случае, если необходимо добавить весь поток к выходному потоку, это используется. На итерационной основе он будет работать с inputStream, вызывая next(), и он будет завершен до тех пор, пока hasNext() не вернет false. Это наиболее эффективный способ добавления, поскольку он итерирует и зацикливается на всех событиях и вызывает добавление к каждому событию. |
| недействительное закрытие () | Наконец, после построения XML необходимо вызвать его, чтобы освободить связанные ресурсы. |
Пример
Давайте посмотрим на пример программы о том, как создать файл XML с именем «geekauthordetails.xml» с помощью XMLEventWriter. Во всем наборе программ, чтобы вывести структурированный вывод,
- используется для того, чтобы данные были доступны в новой строке
- используется для отображения содержимого данных с вкладками.
Если не требуется, мы можем удалить их. Более того, теперь текущая программа выдает результат в файл с именем «geekauthordetails.xml». Если мы хотим отобразить вывод в консоли, нам нужно раскомментировать определенные части кода.
try {
// This line creates the output in file. It has to be commented out
XMLEventWriter xmlEventWriter = xmlOutputFactory
.createXMLEventWriter(new FileOutputStream(geekAuthorFileName), "UTF-8");
// If we want to see the output directly in the console, instead of writing to the file, we can write to the console
// Just uncomment the below line and remove FileNotFoundException, we can achieve that
// XMLEventWriter xmlEventWriter = xmlOutputFactory.createXMLEventWriter(System.out);
}GeekAuthorDetailsStaxXMLWriter.java
Java
import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.util.HashMap;import java.util.Map;import java.util.Set;import javax.xml.stream.XMLEventFactory;import javax.xml.stream.XMLEventWriter;import javax.xml.stream.XMLOutputFactory;import javax.xml.stream.XMLStreamException;import javax.xml.stream.events.Characters;import javax.xml.stream.events.EndElement;import javax.xml.stream.events.StartDocument;import javax.xml.stream.events.StartElement;import javax.xml.stream.events.XMLEvent; public class GeekAuthorDetailsStaxXMLWriter { public static void main(String[] args) { String geekAuthorFileName = "geekauthordetails.xml"; String rootElement = "GeekAuthors"; GeekAuthorDetailsStaxXMLWriter staxXMLWriter = new GeekAuthorDetailsStaxXMLWriter(); Map<String,String> geekAuthorDetailsElementsMap = new HashMap<String, String>(); // Information that needs to be available in xml. // As a key value pair the details are given geekAuthorDetailsElementsMap.put("authorName", "GeekA"); geekAuthorDetailsElementsMap.put("authorAge", "30"); geekAuthorDetailsElementsMap.put("articlesPublishedIn", "Java,Python,Database"); geekAuthorDetailsElementsMap.put("gender", "Female"); staxXMLWriter.writeXML(geekAuthorFileName, rootElement, geekAuthorDetailsElementsMap); } public void writeXML(String geekAuthorFileName, String rootElement, Map<String, String> geekAuthorDetailsElementsMap){ XMLOutputFactory xmlOutputFactory = XMLOutputFactory.newInstance(); try { XMLEventWriter xmlEventWriter = xmlOutputFactory .createXMLEventWriter(new FileOutputStream(geekAuthorFileName), "UTF-8"); // If we want to see the output directly in the console, instead // of writing to the file, we can write to the console // Just uncomment the below line and remove FileNotFoundException, // we can achieve that // XMLEventWriter xmlEventWriter = xmlOutputFactory.createXMLEventWriter(System.out); XMLEventFactory xmlEventFactory = XMLEventFactory.newInstance(); // To finish the ending, we need to end with
, that is line feed XMLEvent endIt = xmlEventFactory.createDTD("
"); StartDocument startDocument = xmlEventFactory.createStartDocument(); xmlEventWriter.add(startDocument); xmlEventWriter.add(endIt); // Always rootElement will be the first // tag for a structured XML document. // Here it is GeekAuthors StartElement configuredStartElement = xmlEventFactory.createStartElement("", "", rootElement); xmlEventWriter.add(configuredStartElement); xmlEventWriter.add(endIt); // Write the element nodes one by one Set<String> elementNodes = geekAuthorDetailsElementsMap.keySet(); // All the elements are iterated using for loop and write perfectly // with the createNode method for(String key : elementNodes){ createNode(xmlEventWriter, key, geekAuthorDetailsElementsMap.get(key)); } xmlEventWriter.add(xmlEventFactory.createEndElement("", "", rootElement)); xmlEventWriter.add(endIt); xmlEventWriter.add(xmlEventFactory.createEndDocument()); xmlEventWriter.close(); // As we are writing to file, it is always good to // handle exceptions related to file as well as XMLStreamException } catch (FileNotFoundException | XMLStreamException e) { e.printStackTrace(); } } private static void createNode(XMLEventWriter eventWriter, String keyElement, String geekAuthorDetailsElementsMapValue) throws XMLStreamException { XMLEventFactory xmlEventFactory = XMLEventFactory.newInstance(); XMLEvent endElement = xmlEventFactory.createDTD("
"); XMLEvent tabElement = xmlEventFactory.createDTD(" "); // Create Start node StartElement startElement = xmlEventFactory.createStartElement("", "", keyElement); // In order to beautify, a tab // element is introduced eventWriter.add(tabElement); eventWriter.add(startElement); // Create Content Characters characters = xmlEventFactory.createCharacters(geekAuthorDetailsElementsMapValue); eventWriter.add(characters); // Create End node EndElement endingElement = xmlEventFactory.createEndElement("", "", keyElement); eventWriter.add(endingElement); eventWriter.add(endElement); }} |
Теперь он настроен на запись вывода в сам файл. Следовательно, мы можем получить файл с именем «geekauthordetails.xml», упомянутый в этом месте. Его содержание следующее. образ содержит оба стиля, если они записаны в консоль/если записаны в файл.
Выход:
Вывод
Хотя и SAX, и StAX являются синтаксическими анализаторами XML на основе потоков или событий, SAX использует модель «выталкивания», тогда как StAX использует модель «вытягивания». через SAX XML не может быть записан и не поддерживается. Но только в StAX с использованием XMLEventWriter возможна запись XML, и это проиллюстрировано в приведенном выше примере программы.