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, и это проиллюстрировано в приведенном выше примере программы.