Учебники

Apache Xerces — Краткое руководство

Apache Xerces — Обзор XML

XML — это простой текстовый язык, разработанный для хранения и передачи данных в текстовом формате. Это означает расширяемый язык разметки. Ниже приведены некоторые характерные особенности XML.

  • XML — это язык разметки.

  • XML — это язык на основе тегов, такой как HTML.

  • Теги XML не предопределены как HTML.

  • Вы можете определить свои собственные теги, поэтому он называется расширяемым языком.

  • XML-теги предназначены для самоописания.

  • XML — это рекомендация W3C для хранения и передачи данных.

XML — это язык разметки.

XML — это язык на основе тегов, такой как HTML.

Теги XML не предопределены как HTML.

Вы можете определить свои собственные теги, поэтому он называется расширяемым языком.

XML-теги предназначены для самоописания.

XML — это рекомендация W3C для хранения и передачи данных.

пример

<?xml version = "1.0"?>
<Class>
   <Name>First</Name>
   <Sections>
      
      <Section>
         <Name>A</Name>
         <Students>
            <Student>Rohan</Student>
            <Student>Mohan</Student>
            <Student>Sohan</Student>
            <Student>Lalit</Student>
            <Student>Vinay</Student>
         </Students>
      </Section>
      
      <Section>
         <Name>B</Name>
         <Students>
            <Student>Robert</Student>
            <Student>Julie</Student>
            <Student>Kalie</Student>
            <Student>Michael</Student>				
         </Students>
      </Section>
      
   </Sections>
</Class>

преимущества

Ниже приведены преимущества, предоставляемые XML —

  • Независимость от технологии — XML, будучи простым текстом, не зависит от технологии. Может использоваться любой технологией для хранения и передачи данных.

  • Удобный для чтения — XML ​​использует простой текстовый формат. Он читабелен и понятен человеку.

  • Расширяемость — в XML настраиваемые теги можно создавать и использовать очень легко.

  • Разрешить проверку — с помощью XSD, DTD и XML структура может быть легко проверена.

Независимость от технологии — XML, будучи простым текстом, не зависит от технологии. Может использоваться любой технологией для хранения и передачи данных.

Удобный для чтения — XML ​​использует простой текстовый формат. Он читабелен и понятен человеку.

Расширяемость — в XML настраиваемые теги можно создавать и использовать очень легко.

Разрешить проверку — с помощью XSD, DTD и XML структура может быть легко проверена.

Недостатки

Ниже приведены недостатки использования XML:

  • Избыточный синтаксис. Обычно XML-файл содержит множество повторяющихся терминов.

  • Verbose. Будучи многословным языком, размер файла XML увеличивает стоимость передачи и хранения.

Избыточный синтаксис. Обычно XML-файл содержит множество повторяющихся терминов.

Verbose. Будучи многословным языком, размер файла XML увеличивает стоимость передачи и хранения.

Apache Xerces — Настройка среды

В этой главе описан процесс настройки Apache Xerces в системах на базе Windows и Linux. Apache Xerces можно легко установить и интегрировать в текущую среду Java, выполнив несколько простых шагов без каких-либо сложных процедур настройки. Администрация пользователя требуется при установке.

Системные Требования

JDK Java SE 2 JDK 1.5 или выше
объем памяти 1 ГБ ОЗУ (рекомендуется)
Дисковое пространство Нет минимальных требований
Версия операционной системы Windows XP или выше, Linux

Давайте теперь перейдем к этапам установки Apache Xerces.

Шаг 1. Проверьте вашу установку Java

Прежде всего, вам необходимо установить в вашу систему Java Software Development Kit (SDK). Чтобы убедиться в этом, выполните любую из двух команд в зависимости от платформы, на которой вы работаете.

Если установка Java прошла успешно, то она отобразит текущую версию и спецификацию вашей установки Java. Пример вывода приведен в следующей таблице.

Платформа команда Пример вывода
Windows Откройте Командную консоль и введите: java -version Версия Java «1.7.0_60» Java (TM) Среда выполнения SE (сборка 1.7.0_60-b19) 64-разрядная серверная виртуальная машина Java Hotspot (TM) (сборка 24.60b09, смешанный режим)
Linux Откройте командный терминал и введите: $ java -version Версия Java «1.7.0_25» Открытая среда выполнения JDK (rhel-2.3.10.4.el6_4-x86_64) Открытая виртуальная машина 64-разрядного сервера JDK (сборка 23.7-b01, смешанный режим)
  • Мы предполагаем, что читатели этого руководства установили Java SDK версии 1.7.0_60 в своей системе.

  • Если у вас нет Java SDK, загрузите его текущую версию с https://www.oracle.com/technetwork/java/javase/downloads/index.html и установите его.

Мы предполагаем, что читатели этого руководства установили Java SDK версии 1.7.0_60 в своей системе.

Если у вас нет Java SDK, загрузите его текущую версию с https://www.oracle.com/technetwork/java/javase/downloads/index.html и установите его.

Шаг 2. Установите среду Java

Установите переменную среды JAVA_HOME, чтобы она указывала на местоположение базовой директории, где установлена ​​Java на вашем компьютере. Например,

Sr.No. Платформа и описание
1

Windows

Установите JAVA_HOME в C: \ ProgramFiles \ java \ jdk1.7.0_60

2

Linux

Экспорт JAVA_HOME = / usr / local / java-current

Windows

Установите JAVA_HOME в C: \ ProgramFiles \ java \ jdk1.7.0_60

Linux

Экспорт JAVA_HOME = / usr / local / java-current

Добавьте полный путь расположения компилятора Java к системному пути.

Sr.No. Платформа и описание
1

Windows

Добавьте строку «C: \ Program Files \ Java \ jdk1.7.0_60 \ bin» в конец системной переменной PATH.

2

Linux

Экспорт PATH = $ PATH: $ JAVA_HOME / bin /

Windows

Добавьте строку «C: \ Program Files \ Java \ jdk1.7.0_60 \ bin» в конец системной переменной PATH.

Linux

Экспорт PATH = $ PATH: $ JAVA_HOME / bin /

Выполните команду Java версии из командной строки, как описано выше.

Шаг 3: Установите библиотеку Apache Xerces

Загрузите последнюю версию Apache Xerces с https://xerces.apache.org/mirrors.cgi « и разархивируйте его содержимое в папку, откуда могут быть связаны необходимые библиотеки с вашей Java-программой. Предположим, что файлы собраны в папка xerces-2_11_0 на диске C.

Добавьте полный путь к пяти банкам, как показано на изображении выше, к CLASSPATH.

Sr.No. Платформа и описание
1

Windows

Добавьте следующие строки в конец пользовательской переменной CLASSPATH —

C: \ Xerces-2_11_0 \ resolver.jar;

C: \ Xerces-2_11_0 \ serializer.jar;

C: \ Xerces-2_11_0 \ xercesImpl.jar;

C: \ Xerces-2_11_0 \ xercesSamples.jar;

C: \ Xerces-2_11_0 \ XML-apis.jar;

2

Linux

Экспортировать CLASSPATH = $ CLASSPATH —

/usr/share/xerces-2_11_0\resolver.jar;

/usr/share/xerces-2_11_0\serializer.jar;

/usr/share/xerces-2_11_0\xercesImpl.jar;

/usr/share/xerces-2_11_0\xercesSamples.jar;

/usr/share/xerces-2_11_0\xml-apis.jar;

Windows

Добавьте следующие строки в конец пользовательской переменной CLASSPATH —

C: \ Xerces-2_11_0 \ resolver.jar;

C: \ Xerces-2_11_0 \ serializer.jar;

C: \ Xerces-2_11_0 \ xercesImpl.jar;

C: \ Xerces-2_11_0 \ xercesSamples.jar;

C: \ Xerces-2_11_0 \ XML-apis.jar;

Linux

Экспортировать CLASSPATH = $ CLASSPATH —

/usr/share/xerces-2_11_0\resolver.jar;

/usr/share/xerces-2_11_0\serializer.jar;

/usr/share/xerces-2_11_0\xercesImpl.jar;

/usr/share/xerces-2_11_0\xercesSamples.jar;

/usr/share/xerces-2_11_0\xml-apis.jar;

Apache Xerces — парсеры XML

Что такое Apache Xerces2?

Xerces2 — это процессор на основе Java, предоставляющий стандартные интерфейсы и реализации для следования стандартам API синтаксического анализа XML —

  • Объектная модель документа (DOM) Уровень 3

  • Простой API для XML (SAX) 2.0.2

  • Потоковый API для XML (StAX) 1.0 Event API

  • Java API для обработки XML (JAXP) 1.4

Объектная модель документа (DOM) Уровень 3

Простой API для XML (SAX) 2.0.2

Потоковый API для XML (StAX) 1.0 Event API

Java API для обработки XML (JAXP) 1.4

Что такое синтаксический анализ XML?

Синтаксический анализ XML означает прохождение XML-документа для доступа к данным или для изменения данных тем или иным способом.

Что такое XML Parser?

XML Parser предоставляет способ доступа или изменения данных, присутствующих в документе XML. Java предоставляет несколько опций для анализа XML-документа. Ниже приведены различные типы синтаксических анализаторов, которые обычно используются для анализа XML-документов.

  • Dom Parser — анализирует документ, загружая все содержимое документа и создавая его полное иерархическое дерево в памяти.

  • SAX Parser — анализирует документ по событиям на основе триггеров. Не загружает полный документ в память.

  • StAX Parser — анализирует документ аналогично SAX-анализатору, но более эффективно.

Dom Parser — анализирует документ, загружая все содержимое документа и создавая его полное иерархическое дерево в памяти.

SAX Parser — анализирует документ по событиям на основе триггеров. Не загружает полный документ в память.

StAX Parser — анализирует документ аналогично SAX-анализатору, но более эффективно.

Теперь мы разработаем каждый анализатор с использованием библиотеки Apache Xerces в наших последующих главах.

Apache Xerces — Обзор анализатора DOM

Объектная модель документа является официальной рекомендацией Консорциума World Wide Web (W3C). Он определяет интерфейс, который позволяет программам получать доступ и обновлять стиль, структуру и содержимое документов XML. XML-парсеры, которые поддерживают DOM, реализуют этот интерфейс.

Когда использовать?

Вы должны использовать DOM-парсер, когда —

  • Вам нужно много знать о структуре документа.

  • Вам нужно перемещать части документа (например, вы можете отсортировать определенные элементы).

  • Вам необходимо использовать информацию в документе более одного раза.

Вам нужно много знать о структуре документа.

Вам нужно перемещать части документа (например, вы можете отсортировать определенные элементы).

Вам необходимо использовать информацию в документе более одного раза.

Что вы получаете?

Когда вы анализируете документ XML с помощью анализатора DOM, вы получаете древовидную структуру, которая содержит все элементы вашего документа. DOM предоставляет множество функций, которые вы можете использовать для проверки содержимого и структуры документа.

преимущества

DOM — это общий интерфейс для управления структурами документов. Одна из целей разработки заключается в том, чтобы код Java, написанный для одного DOM-совместимого парсера, работал на любом другом DOM-совместимом парсере без изменений.

DOM интерфейсы

DOM определяет несколько интерфейсов Java. Вот наиболее распространенные интерфейсы —

  • Узел — базовый тип данных DOM.

  • Элемент — Подавляющее большинство объектов, с которыми вы будете иметь дело, являются Элементами.

  • Attr — представляет атрибут элемента.

  • Текст — фактическое содержание элемента или атрибута.

  • Документ — представляет весь документ XML. Объект Document часто называют деревом DOM.

Узел — базовый тип данных DOM.

Элемент — Подавляющее большинство объектов, с которыми вы будете иметь дело, являются Элементами.

Attr — представляет атрибут элемента.

Текст — фактическое содержание элемента или атрибута.

Документ — представляет весь документ XML. Объект Document часто называют деревом DOM.

Общие методы DOM

Когда вы работаете с DOM, есть несколько методов, которые часто используются —

  • Document.getDocumentElement () — возвращает корневой элемент документа.

  • Node.getFirstChild () — Возвращает первого потомка данного узла.

  • Node.getLastChild () — Возвращает последнего потомка данного узла.

  • Node.getNextSibling () — Эти методы возвращают следующего брата данного узла.

  • Node.getPreviousSibling () — Эти методы возвращают предыдущего родственного элемента данного узла.

  • Node.getAttribute (attrName) — для данного узла возвращает атрибут с запрошенным именем.

Document.getDocumentElement () — возвращает корневой элемент документа.

Node.getFirstChild () — Возвращает первого потомка данного узла.

Node.getLastChild () — Возвращает последнего потомка данного узла.

Node.getNextSibling () — Эти методы возвращают следующего брата данного узла.

Node.getPreviousSibling () — Эти методы возвращают предыдущего родственного элемента данного узла.

Node.getAttribute (attrName) — для данного узла возвращает атрибут с запрошенным именем.

DOM Parser — разбирать XML-документ

Шаги по использованию DOM

Ниже приведены шаги, используемые при анализе документа с использованием анализатора DOM.

  • Импорт пакетов, связанных с XML.

  • Создать DocumentBuilder

  • Создать документ из файла или потока

  • Извлечь корневой элемент

  • Изучить атрибуты

  • Изучить подэлементы

Импорт пакетов, связанных с XML.

Создать DocumentBuilder

Создать документ из файла или потока

Извлечь корневой элемент

Изучить атрибуты

Изучить подэлементы

Импорт пакетов, связанных с XML

import org.w3c.dom.*;
import javax.xml.parsers.*;
import java.io.*;

Создать DocumentBuilder

DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();

Создать документ из файла или потока

StringBuilder xmlStringBuilder = new StringBuilder();
xmlStringBuilder.append("<?xml version = "1.0"?> <class> </class>");
ByteArrayInputStream input =  new ByteArrayInputStream(
   xmlStringBuilder.toString().getBytes("UTF-8"));
Document doc = builder.parse(input);

Извлечь корневой элемент

Element root = document.getDocumentElement();

Изучить атрибуты

//returns specific attribute
getAttribute("attributeName"); 
//returns a Map (table) of names/values
getAttributes(); 

Изучить подэлементы

//returns a list of subelements of specified name
getElementsByTagName("subelementName"); 
//returns a list of all child nodes
getChildNodes(); 

Демо-пример

Вот входной XML-файл, который нам нужно проанализировать —

<?xml version = "1.0"?>
<class>
   
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

Демо-пример

DomParserDemo.java

package com.tutorialspoint.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;

public class DomParserDemo {
   public static void main(String[] args){

      try {	
         File inputFile = new File("input.txt");
         DocumentBuilderFactory dbFactory 
            = DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();
         
         System.out.println("Root element :" 
            + doc.getDocumentElement().getNodeName());
         NodeList nList = doc.getElementsByTagName("student");
         
         System.out.println("----------------------------");
         for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            
            System.out.println("\nCurrent Element :" 
               + nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               
               System.out.println("Student roll no : " 
                  + eElement.getAttribute("rollno"));
               
               System.out.println("First Name : " 
                  + eElement
                  .getElementsByTagName("firstname")
                  .item(0)
                  .getTextContent());
               
               System.out.println("Last Name : " 
               + eElement
                  .getElementsByTagName("lastname")
                  .item(0)
                  .getTextContent());
               
               System.out.println("Nick Name : " 
               + eElement
                  .getElementsByTagName("nickname")
                  .item(0)
                  .getTextContent());
               
               System.out.println("Marks : " 
               + eElement
                  .getElementsByTagName("marks")
                  .item(0)
                  .getTextContent());
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

Root element :class
----------------------------

Current Element :student
Student roll no : 393
First Name : Dinkar
Last Name : Kad
Nick Name : Dinkar
Marks : 85

Current Element :student
Student roll no : 493
First Name : Vineet
Last Name : Gupta
Nick Name : Vinni
Marks : 95

Current Element :student
Student roll no : 593
First Name : Jasvir
Last Name : Singh
Nick Name : Jazz
Marks : 90

DOM Parser — запрос XML-документа

Демо-пример

Вот входной XML-файл, который мы должны запросить —

<?xml version = "1.0"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferarri 101</carname>
      <carname type = "sports car">Ferarri 201</carname>
      <carname type = "sports car">Ferarri 301</carname>
   </supercars>
   
   <supercars company = "Lamborgini">
      <carname>Lamborgini 001</carname>
      <carname>Lamborgini 002</carname>
      <carname>Lamborgini 003</carname>
   </supercars>
   
   <luxurycars company = "Benteley">
      <carname>Benteley 1</carname>
      <carname>Benteley 2</carname>
      <carname>Benteley 3</carname>
   </luxurycars>
</cars>

Демо-пример

QueryXmlFileDemo.java

package com.tutorialspoint.xml;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;

public class QueryXmlFileDemo {
	
   public static void main(String argv[]) {
 
      try {
         File inputFile = new File("input.txt");
         DocumentBuilderFactory dbFactory = 
            DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
         Document doc = dBuilder.parse(inputFile);
         doc.getDocumentElement().normalize();
         System.out.print("Root element: ");
         System.out.println(doc.getDocumentElement().getNodeName());
         NodeList nList = doc.getElementsByTagName("supercars");
         System.out.println("----------------------------");
         for (int temp = 0; temp < nList.getLength(); temp++) {
            Node nNode = nList.item(temp);
            System.out.println("\nCurrent Element :");
            System.out.print(nNode.getNodeName());
            if (nNode.getNodeType() == Node.ELEMENT_NODE) {
               Element eElement = (Element) nNode;
               System.out.print("company : ");
               System.out.println(eElement.getAttribute("company"));
               NodeList carNameList = 
                  eElement.getElementsByTagName("carname");
               for (int count = 0; 
                  count < carNameList.getLength(); count++) {	 
                  Node node1 = carNameList.item(count);
                  if (node1.getNodeType() ==
                     node1.ELEMENT_NODE) {
                     Element car = (Element) node1;
                     System.out.print("car name : ");
                     System.out.println(car.getTextContent());
                     System.out.print("car type : ");
                     System.out.println(car.getAttribute("type"));
                  }
               }
            }
         }
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

Root element :cars
----------------------------

Current Element :supercars
company : Ferrari
car name : Ferarri 101
car type : formula one
car name : Ferarri 201
car type : sports car
car name : Ferarri 301
car type : sports car

Current Element :supercars
company : Lamborgini
car name : Lamborgini 001
car type : 
car name : Lamborgini 002
car type : 
car name : Lamborgini 003
car type : 

DOM Parser — Создание XML-документа

Демо-пример

Вот XML, который нам нужно создать —

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars><supercars company = "Ferrari">
   <carname type = "formula one">Ferrari 101</carname>
   <carname type = "sports">Ferrari 202</carname>
</supercars></cars>

Демо-пример

CreateXmlFileDemo.java

package com.tutorialspoint.xml;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.File;

public class CreateXmlFileDemo {
	
   public static void main(String argv[]) {

      try {
         DocumentBuilderFactory dbFactory =
         DocumentBuilderFactory.newInstance();
         DocumentBuilder dBuilder = 
            dbFactory.newDocumentBuilder();
         Document doc = dBuilder.newDocument();
         
         // root element
         Element rootElement = doc.createElement("cars");
         doc.appendChild(rootElement);

         //  supercars element
         Element supercar = doc.createElement("supercars");
         rootElement.appendChild(supercar);

         // setting attribute to element
         Attr attr = doc.createAttribute("company");
         attr.setValue("Ferrari");
         supercar.setAttributeNode(attr);

         // carname element
         Element carname = doc.createElement("carname");
         Attr attrType = doc.createAttribute("type");
         attrType.setValue("formula one");
         carname.setAttributeNode(attrType);
         carname.appendChild(
         doc.createTextNode("Ferrari 101"));
         supercar.appendChild(carname);

         Element carname1 = doc.createElement("carname");
         Attr attrType1 = doc.createAttribute("type");
         attrType1.setValue("sports");
         carname1.setAttributeNode(attrType1);
         carname1.appendChild(
         doc.createTextNode("Ferrari 202"));
         supercar.appendChild(carname1);

         // write the content into xml file
         TransformerFactory transformerFactory =
         TransformerFactory.newInstance();
         Transformer transformer =
         transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         StreamResult result =
         new StreamResult(new File("C:\\cars.xml"));
         transformer.transform(source, result);
         
         // Output to console for testing
         StreamResult consoleResult =
         new StreamResult(System.out);
         transformer.transform(source, consoleResult);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars><supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars></cars>

DOM Parser — Изменить XML-документ

Демо-пример

Вот входной XML-файл, который мы должны изменить —

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
   <supercars company = "Ferrari">
      <carname type = "formula one">Ferrari 101</carname>
      <carname type = "sports">Ferrari 202</carname>
   </supercars>
   
   <luxurycars company = "Benteley">
      <carname>Benteley 1</carname>
      <carname>Benteley 2</carname>
      <carname>Benteley 3</carname>
   </luxurycars>
</cars>

Демо-пример

ModifyXmlFileDemo.java

package com.tutorialspoint.xml;

import java.io.File;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class ModifyXmlFileDemo {

public static void main(String argv[]) {

   try {
      File inputFile = new File("input.txt"); 	    	
      DocumentBuilderFactory docFactory =
      DocumentBuilderFactory.newInstance();
      DocumentBuilder docBuilder = 
      docFactory.newDocumentBuilder();
      Document doc = docBuilder.parse(inputFile);
      Node cars = doc.getFirstChild();
      Node supercar = doc.getElementsByTagName("supercars").item(0);
      
      // update supercar attribute
      NamedNodeMap attr = supercar.getAttributes();
      Node nodeAttr = attr.getNamedItem("company");
      nodeAttr.setTextContent("Lamborigini");

      // loop the supercar child node
      NodeList list = supercar.getChildNodes();
      for (int temp = 0; temp < list.getLength(); temp++) {
         Node node = list.item(temp);
         if (node.getNodeType() == Node.ELEMENT_NODE) {
            Element eElement = (Element) node;
            if ("carname".equals(eElement.getNodeName())){
               if("Ferrari 101".equals(eElement.getTextContent())){
                  eElement.setTextContent("Lamborigini 001");
               }
            if("Ferrari 202".equals(eElement.getTextContent()))
               eElement.setTextContent("Lamborigini 002");
            }
         }
      }
      
      NodeList childNodes = cars.getChildNodes();
      for(int count = 0; count < childNodes.getLength(); count++){
         Node node = childNodes.item(count);
         if("luxurycars".equals(node.getNodeName()))
            cars.removeChild(node);
         }
         
         // write the content on console
         TransformerFactory transformerFactory = 
         TransformerFactory.newInstance();
         Transformer transformer = transformerFactory.newTransformer();
         DOMSource source = new DOMSource(doc);
         System.out.println("-----------Modified File-----------");
         StreamResult consoleResult = new StreamResult(System.out);
         transformer.transform(source, consoleResult);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

-----------Modified File-----------
<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars>
<supercars company = "Lamborigini">
<carname type = "formula one">Lamborigini 001</carname>
<carname type = "sports">Lamborigini 002</carname>
</supercars></cars>

SAX Parser — Обзор

SAX (простой API для XML) — это анализатор событий на основе событий для документов XML. В отличие от парсера DOM, парсер SAX не создает дерева разбора. SAX — это потоковый интерфейс для XML, что означает, что приложения, использующие SAX, получают уведомления о событиях об обрабатываемом XML-документе — элемент и атрибут, в одно и то же время в последовательном порядке, начиная с верхней части документа и заканчивая закрытием корень элемент.

  • Читает XML-документ сверху вниз, распознавая токены, которые составляют правильно сформированный XML-документ.

  • Токены обрабатываются в том же порядке, в котором они указаны в документе.

  • Сообщает прикладной программе о характере токенов, с которыми анализатор сталкивался по мере их появления.

  • Прикладная программа предоставляет обработчик «события», который должен быть зарегистрирован парсером.

  • Когда токены идентифицированы, методы обратного вызова в обработчике вызываются с соответствующей информацией.

Читает XML-документ сверху вниз, распознавая токены, которые составляют правильно сформированный XML-документ.

Токены обрабатываются в том же порядке, в котором они указаны в документе.

Сообщает прикладной программе о характере токенов, с которыми анализатор сталкивался по мере их появления.

Прикладная программа предоставляет обработчик «события», который должен быть зарегистрирован парсером.

Когда токены идентифицированы, методы обратного вызова в обработчике вызываются с соответствующей информацией.

Когда использовать?

Вы должны использовать парсер SAX, когда —

  • Вы можете обрабатывать XML-документ линейно сверху вниз.

  • Документ не является глубоко вложенным.

  • Вы обрабатываете очень большой XML-документ, дерево DOM которого будет занимать много памяти. Типичные реализации DOM используют десять байтов памяти для представления одного байта XML.

  • Проблема, которая должна быть решена, включает только часть XML-документа.

  • Данные становятся доступными, как только они видятся синтаксическим анализатором, поэтому SAX хорошо работает для XML-документа, который поступает через поток.

Вы можете обрабатывать XML-документ линейно сверху вниз.

Документ не является глубоко вложенным.

Вы обрабатываете очень большой XML-документ, дерево DOM которого будет занимать много памяти. Типичные реализации DOM используют десять байтов памяти для представления одного байта XML.

Проблема, которая должна быть решена, включает только часть XML-документа.

Данные становятся доступными, как только они видятся синтаксическим анализатором, поэтому SAX хорошо работает для XML-документа, который поступает через поток.

Недостатки SAX

  • У нас нет произвольного доступа к документу XML, поскольку он обрабатывается в прямом направлении.

  • Если вам нужно отслеживать данные, которые анализатор видел, или изменять порядок элементов, вы должны написать код и сохранить данные самостоятельно.

У нас нет произвольного доступа к документу XML, поскольку он обрабатывается в прямом направлении.

Если вам нужно отслеживать данные, которые анализатор видел, или изменять порядок элементов, вы должны написать код и сохранить данные самостоятельно.

Интерфейс ContentHandler

Этот интерфейс указывает методы обратного вызова, которые использует синтаксический анализатор SAX для уведомления прикладной программы о компонентах документа XML, которые он видел.

  • void startDocument ()вызывается в начале документа.

  • void endDocument () — Вызывается в начале документа.

  • void startElement (String uri, String localName, String qName, Attributes atts) — Вызывается в начале элемента.

  • void endElement (String uri, String localName, String qName) — Вызывается в конце элемента.

  • Пустые символы (char [] ch, int start, int length) — Вызывается, когда встречаются символьные данные.

  • void ignorableWhitespace (char [] ch, int start, int length) — Вызывается, когда присутствует DTD и встречаются игнорируемые пробелы.

  • void processingInstruction (String target, String data) — Вызывается при распознавании инструкции обработки.

  • void setDocumentLocator (Locator locator)) — Предоставляет локатор, который можно использовать для определения позиций в документе.

  • void skippedEntity (String name) — Вызывается, когда встречается неразрешенная сущность.

  • void startPrefixMapping (String prefix, String uri) — Вызывается, когда определяется новое сопоставление пространства имен.

  • void endPrefixMapping (String prefix)вызывается, когда определение пространства имен заканчивает свою область.

void startDocument ()вызывается в начале документа.

void endDocument () — Вызывается в начале документа.

void startElement (String uri, String localName, String qName, Attributes atts) — Вызывается в начале элемента.

void endElement (String uri, String localName, String qName) — Вызывается в конце элемента.

Пустые символы (char [] ch, int start, int length) — Вызывается, когда встречаются символьные данные.

void ignorableWhitespace (char [] ch, int start, int length) — Вызывается, когда присутствует DTD и встречаются игнорируемые пробелы.

void processingInstruction (String target, String data) — Вызывается при распознавании инструкции обработки.

void setDocumentLocator (Locator locator)) — Предоставляет локатор, который можно использовать для определения позиций в документе.

void skippedEntity (String name) — Вызывается, когда встречается неразрешенная сущность.

void startPrefixMapping (String prefix, String uri) — Вызывается, когда определяется новое сопоставление пространства имен.

void endPrefixMapping (String prefix)вызывается, когда определение пространства имен заканчивает свою область.

Интерфейс атрибутов

Этот интерфейс определяет методы для обработки атрибутов, связанных с элементом.

  • int getLength () — Возвращает количество атрибутов.

  • Строка getQName (int index)

  • Строка getValue (int index)

  • Строка getValue (Строка qname)

int getLength () — Возвращает количество атрибутов.

Строка getQName (int index)

Строка getValue (int index)

Строка getValue (Строка qname)

SAX Parser — разбирать XML-документ

Демо-пример

Вот входной XML-файл, который нам нужно проанализировать —

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

UserHandler.java

package com.tutorialspoint.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;

   @Override
   public void startElement(String uri, 
   String localName, String qName, Attributes attributes) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         String rollNo = attributes.getValue("rollno");
         System.out.println("Roll No : " + rollNo);
      } else if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      } else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(String uri, 
   String localName, String qName) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         System.out.println("End Element :" + qName);
      }
   }

   @Override
   public void characters(char ch[], int start, int length) throws SAXException {
      if (bFirstName) {
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

SAXParserDemo.java

package com.tutorialspoint.xml;

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXParserDemo {
   public static void main(String[] args){

      try {	
         File inputFile = new File("input.txt");
         SAXParserFactory factory = SAXParserFactory.newInstance();
         SAXParser saxParser = factory.newSAXParser();
         UserHandler userhandler = new UserHandler();
         saxParser.parse(inputFile, userhandler);     
      } catch (Exception e) {
         e.printStackTrace();
      }
   }   
}

class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;

   @Override
   public void startElement(String uri, 
      String localName, String qName, Attributes attributes) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         String rollNo = attributes.getValue("rollno");
         System.out.println("Roll No : " + rollNo);
      } else if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      } else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(String uri, 
      String localName, String qName) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         System.out.println("End Element :" + qName);
      }
   }

   @Override
   public void characters(char ch[], int start, int length) throws SAXException {
      if (bFirstName) {
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

Roll No : 393
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element :student
Roll No : 493
First Name: Vineet
Last Name: Gupta
Nick Name: Vinni
Marks: 95
End Element :student
Roll No : 593
First Name: Jasvir
Last Name: Singh
Nick Name: Jazz
Marks: 90
End Element :student

SAX Parser — Запрос XML-документа

Демо-пример

Вот входной текстовый файл, который нам нужен для запроса на рулон №: 393 —

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

UserHandler.java

package com.tutorialspoint.xml;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
 
public class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;
   String rollNo = null;

   @Override
   public void startElement(String uri, 
      String localName, String qName, Attributes attributes) throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         rollNo = attributes.getValue("rollno");
      }
      if(("393").equals(rollNo) && qName.equalsIgnoreCase("student")){
         System.out.println("Start Element :" + qName);      
      }       
      if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      } else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(String uri, String localName, String qName) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         if(("393").equals(rollNo) 
            && qName.equalsIgnoreCase("student"))
            System.out.println("End Element :" + qName);
      }
   }


   @Override
   public void characters(char ch[], int start, int length) throws SAXException {

      if (bFirstName && ("393").equals(rollNo)) {
         //age element, set Employee age
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName && ("393").equals(rollNo)) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName && ("393").equals(rollNo)) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks && ("393").equals(rollNo)) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

SAXQueryDemo.java

package com.tutorialspoint.xml;

import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXQueryDemo {
   public static void main(String[] args){

      try {	
         File inputFile = new File("input.txt");
         SAXParserFactory factory = SAXParserFactory.newInstance();
         SAXParser saxParser = factory.newSAXParser();
         UserHandler userhandler = new UserHandler();
         saxParser.parse(inputFile, userhandler);     
      } catch (Exception e) {
         e.printStackTrace();
      }
   }   
}

class UserHandler extends DefaultHandler {

   boolean bFirstName = false;
   boolean bLastName = false;
   boolean bNickName = false;
   boolean bMarks = false;
   String rollNo = null;

   @Override
   public void startElement(String uri, 
      String localName, String qName, Attributes attributes) throws SAXException {

      if (qName.equalsIgnoreCase("student")) {
         rollNo = attributes.getValue("rollno");
      }
      if(("393").equals(rollNo) &&
         qName.equalsIgnoreCase("student")){
         System.out.println("Start Element :" + qName);      
      }       
      if (qName.equalsIgnoreCase("firstname")) {
         bFirstName = true;
      } else if (qName.equalsIgnoreCase("lastname")) {
         bLastName = true;
      } else if (qName.equalsIgnoreCase("nickname")) {
         bNickName = true;
      } else if (qName.equalsIgnoreCase("marks")) {
         bMarks = true;
      }
   }

   @Override
   public void endElement(String uri, 
      String localName, String qName) throws SAXException {
      if (qName.equalsIgnoreCase("student")) {
         if(("393").equals(rollNo) 
            && qName.equalsIgnoreCase("student"))
            System.out.println("End Element :" + qName);
      }
   }


   @Override
   public void characters(char ch[], int start, int length) throws SAXException {

      if (bFirstName && ("393").equals(rollNo)) {
         //age element, set Employee age
         System.out.println("First Name: " + new String(ch, start, length));
         bFirstName = false;
      } else if (bLastName && ("393").equals(rollNo)) {
         System.out.println("Last Name: " + new String(ch, start, length));
         bLastName = false;
      } else if (bNickName && ("393").equals(rollNo)) {
         System.out.println("Nick Name: " + new String(ch, start, length));
         bNickName = false;
      } else if (bMarks && ("393").equals(rollNo)) {
         System.out.println("Marks: " + new String(ch, start, length));
         bMarks = false;
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

Start Element :student
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element :student

SAX Parser — Создание XML-документа

Для создания XML лучше использовать парсер StAX, чем парсер SAX. Пожалуйста, обратитесь к разделу Java StAX Parser для того же.

SAX Parser — Изменить XML-документ

Демо-пример

Вот входной XML-файл, который нам нужно изменить, добавив <Result> Pass <Result /> в конце тега </ marks> .

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

SAXModifyDemo.java

package com.tutorialspoint.xml;

import java.io.*;
import org.xml.sax.*;
import javax.xml.parsers.*;
import org.xml.sax.helpers.DefaultHandler;

public class SAXModifyDemo extends DefaultHandler {
   static String displayText[] = new String[1000];
   static int numberLines = 0;
   static String indentation = "";

   public static void main(String args[]) {

      try {	
         File inputFile = new File("input.txt");
         SAXParserFactory factory = 
         SAXParserFactory.newInstance();
         SAXModifyDemo obj = new SAXModifyDemo();
         obj.childLoop(inputFile);
         FileWriter filewriter = new FileWriter("newfile.xml");
         for(int loopIndex = 0; loopIndex < numberLines; loopIndex++){
            filewriter.write(displayText[loopIndex].toCharArray());
            filewriter.write('\n');
            System.out.println(displayText[loopIndex].toString());
         }
         filewriter.close();
      } catch (Exception e) {
         e.printStackTrace(System.err);
      }
   }

   public void childLoop(File input){
      DefaultHandler handler = this;
      SAXParserFactory factory = SAXParserFactory.newInstance();
      try {
         SAXParser saxParser = factory.newSAXParser();
         saxParser.parse(input, handler);
      } catch (Throwable t) {}
   }

   public void startDocument() {
      displayText[numberLines] = indentation;
      displayText[numberLines] += "<?xml version=\"1.0\" encoding=\""+
         "UTF-8" + "\"?>";
      numberLines++;
   }

   public void processingInstruction(String target, String data) {
      displayText[numberLines] = indentation;
      displayText[numberLines] += "<?";
      displayText[numberLines] += target;
      if (data != null && data.length() > 0) {
         displayText[numberLines] += ' ';
         displayText[numberLines] += data;
      }
      displayText[numberLines] += "?>";
      numberLines++;
   }

   public void startElement(String uri, String localName,
      String qualifiedName, Attributes attributes) {
      displayText[numberLines] = indentation;

      indentation += "    ";

      displayText[numberLines] += '<';
      displayText[numberLines] += qualifiedName;
      if (attributes != null) {
         int numberAttributes = attributes.getLength();
         for (int loopIndex = 0; loopIndex < numberAttributes;
            loopIndex++){
            displayText[numberLines] += ' ';
            displayText[numberLines] += attributes.getQName(loopIndex);
            displayText[numberLines] += "=\"";
            displayText[numberLines] += attributes.getValue(loopIndex);
            displayText[numberLines] += '"';
         }
      }
      displayText[numberLines] += '>';
      numberLines++;
   }

   public void characters(char characters[], int start, int length) {
      String characterData = (new String(characters, start, length)).trim();
      if(characterData.indexOf("\n") < 0 && characterData.length() > 0) {
         displayText[numberLines] = indentation;
         displayText[numberLines] += characterData;
         numberLines++;
      }
   }

   public void endElement(String uri, String localName, String qualifiedName) {
      indentation = indentation.substring(0, indentation.length() - 4);
      displayText[numberLines] = indentation;
      displayText[numberLines] += "</";
      displayText[numberLines] += qualifiedName;
      displayText[numberLines] += '>';
      numberLines++;

      if (qualifiedName.equals("marks")) {
         startElement("", "Result", "Result", null);
         characters("Pass".toCharArray(), 0, "Pass".length());
         endElement("", "Result", "Result");
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

<?xml version = "1.0" encoding = "UTF-8"?>
<class>
   <student rollno = "393">
      <firstname>
         Dinkar
      </firstname>

      <lastname>
         Kad
      </lastname>

      <nickname>
         Dinkar
      </nickname>

      <marks>
         85
      </marks>

      <Result>
         Pass
      </Result>
   </student>
    
   <student rollno = "493">
      <firstname>
         Vineet
      </firstname>

      <lastname>
         Gupta
      </lastname>

      <nickname>
         Vinni
      </nickname>

      <marks>
         95
      </marks>

      <Result>
         Pass
      </Result>
   </student>
    
   <student rollno = "593">
      <firstname>
         Jasvir
      </firstname>

      <lastname>
         Singh
      </lastname>

      <nickname>
         Jazz
      </nickname>

      <marks>
        90
      </marks>

      <Result>
         Pass
      </Result>
   </student>
</class>

StAX Parser — Обзор

StAX — это API на основе JAVA для анализа XML-документа аналогично SAX-анализатору. Но есть два основных различия между двумя API —

  • StAX — это PULL API, тогда как SAX — это PUSH API. Это означает, что в случае синтаксического анализатора StAX клиентское приложение должно запрашивать синтаксический анализатор StAX для получения информации из XML всякий раз, когда это необходимо, но в случае синтаксического анализатора SAX клиентское приложение должно получать информацию, когда синтаксический анализатор SAX уведомляет клиентское приложение о том, что информация доступен.

  • StAX API может читать и писать документы XML. Используя SAX API, xml можно только читать.

StAX — это PULL API, тогда как SAX — это PUSH API. Это означает, что в случае синтаксического анализатора StAX клиентское приложение должно запрашивать синтаксический анализатор StAX для получения информации из XML всякий раз, когда это необходимо, но в случае синтаксического анализатора SAX клиентское приложение должно получать информацию, когда синтаксический анализатор SAX уведомляет клиентское приложение о том, что информация доступен.

StAX API может читать и писать документы XML. Используя SAX API, xml можно только читать.

Ниже приведены функции API StAX —

  • Читает XML-документ сверху вниз, распознавая токены, которые составляют правильно сформированный XML-документ.

  • Токены обрабатываются в том же порядке, в котором они указаны в документе.

  • Сообщает прикладной программе о природе токенов, с которыми синтаксический анализатор сталкивался по мере их появления.

  • Прикладная программа предоставляет «читатель» события, который действует как итератор и выполняет итерацию по событию, чтобы получить необходимую информацию. Другое доступное средство чтения — это средство чтения «курсора», которое действует как указатель на узлы xml.

  • Когда события идентифицированы, элементы xml могут быть извлечены из объекта события и могут быть обработаны в дальнейшем.

Читает XML-документ сверху вниз, распознавая токены, которые составляют правильно сформированный XML-документ.

Токены обрабатываются в том же порядке, в котором они указаны в документе.

Сообщает прикладной программе о природе токенов, с которыми синтаксический анализатор сталкивался по мере их появления.

Прикладная программа предоставляет «читатель» события, который действует как итератор и выполняет итерацию по событию, чтобы получить необходимую информацию. Другое доступное средство чтения — это средство чтения «курсора», которое действует как указатель на узлы xml.

Когда события идентифицированы, элементы xml могут быть извлечены из объекта события и могут быть обработаны в дальнейшем.

Когда использовать?

Вы должны использовать анализатор StAX, когда —

  • Вы можете обрабатывать XML-документ линейно сверху вниз.

  • Документ не является глубоко вложенным.

  • Вы обрабатываете очень большой XML-документ, дерево DOM которого будет занимать слишком много памяти. Типичные реализации DOM используют десять байтов памяти для представления одного байта XML.

  • Проблема, которая должна быть решена, включает только часть XML-документа.

  • Данные становятся доступными, как только они анализируются парсером, поэтому StAX хорошо работает для XML-документа, который поступает через поток.

Вы можете обрабатывать XML-документ линейно сверху вниз.

Документ не является глубоко вложенным.

Вы обрабатываете очень большой XML-документ, дерево DOM которого будет занимать слишком много памяти. Типичные реализации DOM используют десять байтов памяти для представления одного байта XML.

Проблема, которая должна быть решена, включает только часть XML-документа.

Данные становятся доступными, как только они анализируются парсером, поэтому StAX хорошо работает для XML-документа, который поступает через поток.

Недостатки SAX

  • У нас нет произвольного доступа к документу XML, так как он обрабатывается только для пересылки.

  • Если вам нужно отслеживать данные, которые анализатор видел, или изменять порядок элементов, вы должны написать код и сохранить данные самостоятельно.

У нас нет произвольного доступа к документу XML, так как он обрабатывается только для пересылки.

Если вам нужно отслеживать данные, которые анализатор видел, или изменять порядок элементов, вы должны написать код и сохранить данные самостоятельно.

Класс XMLEventReader

Этот класс предоставляет итератор событий, который можно использовать для итерации по событиям, возникающим при анализе документа XML.

  • StartElement asStartElement () — Используется для получения значения и атрибутов элемента.

  • EndElement asEndElement () — Вызывается в конце элемента.

  • Символы asCharacters () — могут использоваться для получения таких символов, как CDATA, пробелы и т. Д.

StartElement asStartElement () — Используется для получения значения и атрибутов элемента.

EndElement asEndElement () — Вызывается в конце элемента.

Символы asCharacters () — могут использоваться для получения таких символов, как CDATA, пробелы и т. Д.

Класс XMLEventWriter

Этот интерфейс определяет методы для создания события.

  • add (Событие события) — добавляет событие, содержащее элементы, в XML.

add (Событие события) — добавляет событие, содержащее элементы, в XML.

Класс XMLStreamReader

Этот класс предоставляет итератор событий, который можно использовать для итерации по событиям, возникающим при анализе XML-документа.

  • int next () — Используется для получения следующего события.

  • boolean hasNext () — Используется, чтобы проверить, существуют ли другие события или нет

  • String getText () — используется для получения текста элемента

  • String getLocalName () — используется для получения имени элемента

int next () — Используется для получения следующего события.

boolean hasNext () — Используется, чтобы проверить, существуют ли другие события или нет

String getText () — используется для получения текста элемента

String getLocalName () — используется для получения имени элемента

Класс XMLStreamWriter

Этот интерфейс определяет методы для создания события.

  • writeStartElement (String localName) — добавляет начальный элемент с заданным именем.

  • writeEndElement (String localName) — добавляет конечный элемент с заданным именем.

  • writeAttribute (String localName, String value) — записывает атрибут в элемент.

writeStartElement (String localName) — добавляет начальный элемент с заданным именем.

writeEndElement (String localName) — добавляет конечный элемент с заданным именем.

writeAttribute (String localName, String value) — записывает атрибут в элемент.

StAX Parser — Разбор XML-документа

Демо-пример

Вот входной XML-файл, который нам нужно проанализировать —

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

StAXParserDemo.java

package com.tutorialspoint.xml;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class StAXParserDemo {
   public static void main(String[] args) {
      boolean bFirstName = false;
      boolean bLastName = false;
      boolean bNickName = false;
      boolean bMarks = false;
      try {
         XMLInputFactory factory = XMLInputFactory.newInstance();
         XMLEventReader eventReader =
         factory.createXMLEventReader(new FileReader("input.txt"));

         while(eventReader.hasNext()){
            XMLEvent event = eventReader.nextEvent();
            switch(event.getEventType()){
               case XMLStreamConstants.START_ELEMENT:
                  StartElement startElement = event.asStartElement();
                  String qName = startElement.getName().getLocalPart();
                  if (qName.equalsIgnoreCase("student")) {
                     System.out.println("Start Element : student");
                     Iterator<Attribute> attributes = startElement.getAttributes();
                     String rollNo = attributes.next().getValue();
                     System.out.println("Roll No : " + rollNo);
                  } else if (qName.equalsIgnoreCase("firstname")) {
                     bFirstName = true;
                  } else if (qName.equalsIgnoreCase("lastname")) {
                     bLastName = true;
                  } else if (qName.equalsIgnoreCase("nickname")) {
                     bNickName = true;
                  } else if (qName.equalsIgnoreCase("marks")) {
                     bMarks = true;
                  }				        
                  break;
               case XMLStreamConstants.CHARACTERS:
                  Characters characters = event.asCharacters();
                  if(bFirstName){
                     System.out.println("First Name: " + characters.getData());
                     bFirstName = false;
                  }
                  if(bLastName){
                     System.out.println("Last Name: " + characters.getData());
                     bLastName = false;
                  }
                  if(bNickName){
                     System.out.println("Nick Name: " + characters.getData());
                     bNickName = false;
                  }
                  if(bMarks){
                     System.out.println("Marks: " + characters.getData());
                     bMarks = false;
                  }
                  break;
               case XMLStreamConstants.END_ELEMENT:
                  EndElement endElement = event.asEndElement();
                  if(endElement.getName().getLocalPart().equalsIgnoreCase("student")){
                     System.out.println("End Element : student");
                     System.out.println();
                  }
                  break;
            }		    
         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (XMLStreamException e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

Start Element : student
Roll No : 393
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element : student

Start Element : student
Roll No : 493
First Name: Vineet
Last Name: Gupta
Nick Name: Vinni
Marks: 95
End Element : student

Start Element : student
Roll No : 593
First Name: Jasvir
Last Name: Singh
Nick Name: Jazz
Marks: 90
End Element : student

StAX Parser — запрос XML-документа

Демо-пример

Вот входной XML-файл, который нам нужно проанализировать —

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

StAXParserDemo.java

package com.tutorialspoint.xml;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.Iterator;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

public class StAXQueryDemo {
   public static void main(String[] args) {
      boolean bFirstName = false;
      boolean bLastName = false;
      boolean bNickName = false;
      boolean bMarks = false;
      boolean isRequestRollNo = false;
      try {
         XMLInputFactory factory = XMLInputFactory.newInstance();
         XMLEventReader eventReader = factory.createXMLEventReader(
            new FileReader("input.txt"));

         String requestedRollNo = "393";
         while(eventReader.hasNext()){
            XMLEvent event = eventReader.nextEvent();
            switch(event.getEventType()){
               case XMLStreamConstants.START_ELEMENT:
                  StartElement startElement = event.asStartElement();
                  String qName = startElement.getName().getLocalPart();
                  if (qName.equalsIgnoreCase("student")) {
                     Iterator<Attribute> attributes = startElement.getAttributes();
                     String rollNo = attributes.next().getValue();
                     if(rollNo.equalsIgnoreCase(requestedRollNo)){
                        System.out.println("Start Element : student");
                        System.out.println("Roll No : " + rollNo);
                        isRequestRollNo = true;
                     }
                  } else if (qName.equalsIgnoreCase("firstname")) {
                     bFirstName = true;
                  } else if (qName.equalsIgnoreCase("lastname")) {
                     bLastName = true;
                  } else if (qName.equalsIgnoreCase("nickname")) {
                     bNickName = true;
                  } else if (qName.equalsIgnoreCase("marks")) {
                     bMarks = true;
                  }				        
                  break;
               case XMLStreamConstants.CHARACTERS:
                  Characters characters = event.asCharacters();
                  if(bFirstName && isRequestRollNo){
                     System.out.println("First Name: " + characters.getData());
                     bFirstName = false;
                  }
                  if(bLastName && isRequestRollNo){
                     System.out.println("Last Name: " + characters.getData());
                     bLastName = false;
                  }
                  if(bNickName && isRequestRollNo){
                     System.out.println("Nick Name: " + characters.getData());
                     bNickName = false;
                  }
                  if(bMarks && isRequestRollNo){
                     System.out.println("Marks: " + characters.getData());
                     bMarks = false;
                  }
                  break;
               case  XMLStreamConstants.END_ELEMENT:
                  EndElement endElement = event.asEndElement();
                  if(endElement.getName().getLocalPart().equalsIgnoreCase("student") && isRequestRollNo){
                     System.out.println("End Element : student");
                     System.out.println();
                     isRequestRollNo = false;
                  }
                  break;
            }		    
         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (XMLStreamException e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

Start Element : student
Roll No : 393
First Name: Dinkar
Last Name: Kad
Nick Name: Dinkar
Marks: 85
End Element : student

StAX Parser — Создание XML-документа

Демо-пример

Вот XML, который нам нужно создать —

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
   <cars><supercars company = "Ferrari">
   <carname type = "formula one">Ferrari 101</carname>
   <carname type = "sports">Ferrari 202</carname>
</supercars></cars>

Демо-пример

StAXCreateXMLDemo.java

package com.tutorialspoint.xml;

import java.io.IOException;
import java.io.StringWriter;

import javax.xml.stream.XMLOutputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamWriter;

public class StAXCreateXMLDemo {
   public static void main(String[] args) {
      try {
         StringWriter stringWriter = new StringWriter();

         XMLOutputFactory xMLOutputFactory = XMLOutputFactory.newInstance();	
         XMLStreamWriter xMLStreamWriter = xMLOutputFactory.createXMLStreamWriter(stringWriter);
   
         xMLStreamWriter.writeStartDocument();
         xMLStreamWriter.writeStartElement("cars");
   
         xMLStreamWriter.writeStartElement("supercars");			
         xMLStreamWriter.writeAttribute("company", "Ferrari");
      
         xMLStreamWriter.writeStartElement("carname");			
         xMLStreamWriter.writeAttribute("type", "formula one");
         xMLStreamWriter.writeCharacters("Ferrari 101");
         xMLStreamWriter.writeEndElement();

         xMLStreamWriter.writeStartElement("carname");			
         xMLStreamWriter.writeAttribute("type", "sports");
         xMLStreamWriter.writeCharacters("Ferrari 202");
         xMLStreamWriter.writeEndElement();

         xMLStreamWriter.writeEndElement();
         xMLStreamWriter.writeEndDocument();

         xMLStreamWriter.flush();
         xMLStreamWriter.close();

         String xmlString = stringWriter.getBuffer().toString();

         stringWriter.close();

         System.out.println(xmlString);

      } catch (XMLStreamException e) {
         e.printStackTrace();
      } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —

<?xml version = "1.0" encoding = "UTF-8" standalone = "no"?>
<cars><supercars company = "Ferrari">
<carname type = "formula one">Ferrari 101</carname>
<carname type = "sports">Ferrari 202</carname>
</supercars></cars>

StAX Parser — Изменить XML-документ

Демо-пример

Для запуска этого примера у вас должен быть jdom.jar в пути к классу вашего приложения. Загрузите jdom-2.0.5.zip.

Вот XML, который мы должны изменить —

<?xml version = "1.0"?>
<class>
   <student rollno = "393">
      <firstname>Dinkar</firstname>
      <lastname>Kad</lastname>
      <nickname>Dinkar</nickname>
      <marks>85</marks>
   </student>
   
   <student rollno = "493">
      <firstname>Vineet</firstname>
      <lastname>Gupta</lastname>
      <nickname>Vinni</nickname>
      <marks>95</marks>
   </student>
   
   <student rollno = "593">
      <firstname>Jasvir</firstname>
      <lastname>Singh</lastname>
      <nickname>Jazz</nickname>
      <marks>90</marks>
   </student>
</class>

Демо-пример

StAXModifyDemo.java

package com.tutorialspoint.xml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class StAXModifyDemo {
   public static void main(String[] args) {

      try {
         XMLInputFactory factory = XMLInputFactory.newInstance();
         XMLEventReader eventReader =
            factory.createXMLEventReader(
               new FileReader("input.txt"));
         SAXBuilder saxBuilder = new SAXBuilder();
         Document document = saxBuilder.build(new File("input.txt"));
         Element rootElement = document.getRootElement();
         List<Element> studentElements = rootElement.getChildren("student");
         while(eventReader.hasNext()){
            XMLEvent event = eventReader.nextEvent();
            switch(event.getEventType()){
               case XMLStreamConstants.START_ELEMENT:
               StartElement startElement = event.asStartElement();
               String qName = startElement.getName().getLocalPart();

               if (qName.equalsIgnoreCase("student")) {				        	
                  Iterator<Attribute> attributes = startElement.getAttributes();
                  String rollNo = attributes.next().getValue();				           
                  if(rollNo.equalsIgnoreCase("393")){     	 
                     //get the student with roll no 393				                 
                     for(int i=0;i < studentElements.size();i++){
                        Element studentElement = studentElements.get(i);
                        if(studentElement.getAttribute("rollno").getValue().equalsIgnoreCase("393")){
                           studentElement.removeChild("marks");
                           studentElement.addContent(new Element("marks").setText("80"));
                        }
                    }
                  }
               }       
               break;
            }		    
         }
         XMLOutputter xmlOutput = new XMLOutputter();
         // display xml
         xmlOutput.setFormat(Format.getPrettyFormat());
         xmlOutput.output(document, System.out); 
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (XMLStreamException e) {
         e.printStackTrace();
      } catch (JDOMException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Вышеуказанная программа сгенерирует следующий результат —