XML EventWriter в Java StAX

Опубликовано: 10 Января, 2023

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