Java 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 увеличивает стоимость передачи и хранения.
Java XML — парсеры
Синтаксический анализ XML относится к просмотру XML-документа для доступа к данным или их изменения.
Что такое XML Parser?
XML Parser предоставляет способ доступа или изменения данных в документе XML. Java предоставляет несколько опций для анализа XML-документов. Ниже приведены различные типы синтаксических анализаторов, которые обычно используются для анализа XML-документов.
-
Dom Parser — анализирует XML-документ, загружая все содержимое документа и создавая его полное иерархическое дерево в памяти.
-
SAX Parser — анализирует XML-документ по триггерам на основе событий. Не загружает полный документ в память.
-
Анализатор JDOM — анализирует XML-документ аналогично анализатору DOM, но более простым способом.
-
StAX Parser — анализирует XML-документ аналогично SAX-анализатору, но более эффективным способом.
-
Анализатор XPath — анализирует XML-документ на основе выражения и широко используется в сочетании с XSLT.
-
DOM4J Parser — библиотека Java для анализа XML, XPath и XSLT с использованием Java Collections Framework. Он обеспечивает поддержку DOM, SAX и JAXP.
Dom Parser — анализирует XML-документ, загружая все содержимое документа и создавая его полное иерархическое дерево в памяти.
SAX Parser — анализирует XML-документ по триггерам на основе событий. Не загружает полный документ в память.
Анализатор JDOM — анализирует XML-документ аналогично анализатору DOM, но более простым способом.
StAX Parser — анализирует XML-документ аналогично SAX-анализатору, но более эффективным способом.
Анализатор XPath — анализирует XML-документ на основе выражения и широко используется в сочетании с XSLT.
DOM4J Parser — библиотека Java для анализа XML, XPath и XSLT с использованием Java Collections Framework. Он обеспечивает поддержку DOM, SAX и JAXP.
Доступны API-интерфейсы JAXB и XSLT для обработки синтаксического анализа XML объектно-ориентированным способом. Мы подробно рассмотрим каждый синтаксический анализатор в последующих главах этого урока.
Java DOM Parser — Обзор
Объектная модель документа (DOM) является официальной рекомендацией Консорциума World Wide Web (W3C). Он определяет интерфейс, который позволяет программам получать доступ и обновлять стиль, структуру и содержимое документов XML. XML-парсеры, поддерживающие DOM, реализуют этот интерфейс.
Когда использовать?
Вы должны использовать DOM-парсер, когда —
-
Вам нужно много знать о структуре документа.
-
Вам нужно перемещать части XML-документа (например, вы можете отсортировать определенные элементы).
-
Вам необходимо использовать информацию в документе XML более одного раза.
Вам нужно много знать о структуре документа.
Вам нужно перемещать части XML-документа (например, вы можете отсортировать определенные элементы).
Вам необходимо использовать информацию в документе XML более одного раза.
Что вы получаете?
Когда вы анализируете документ 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) — для данного узла он возвращает атрибут с запрошенным именем.
Java DOM Parser — разбирать XML-документ
Шаги к использованию JDOM
Ниже приведены шаги, используемые при синтаксическом анализе документа с использованием JDOM Parser.
- Импорт пакетов, связанных с 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"?>"); 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</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 : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singn Nick Name : jazz Marks : 90
Java 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 : supercarscompany : 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 : supercarscompany : Lamborgini car name : Lamborgini 001 car type : car name : Lamborgini 002 car type : car name : Lamborgini 003 car type :
Java 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>
Java 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.xml"); 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>
Java 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)
Java 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</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: Vaneet Last Name: Gupta Nick Name: vinni Marks: 95 End Element :student Roll No : 593 First Name: jasvir Last Name: singn Nick Name: jazz Marks: 90 End Element :student
Java SAX Parser — запрос XML-документа
Демо-пример
Вот входной текстовый файл, который нам нужен для запроса rollno: 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</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
Java SAX Parser — Создание XML-документа
Для создания документов XML лучше использовать анализатор StAX, а не анализатор SAX. Пожалуйста, обратитесь к разделу Java StAX Parser для того же.
Java 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</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> Vaneet </firstname> <lastname> Gupta </lastname> <nickname> vinni </nickname> <marks> 95 </marks> <Result> Pass </Result> </student> <student rollno = "593"> <firstname> jasvir </firstname> <lastname> singn </lastname> <nickname> jazz </nickname> <marks> 90 </marks> <Result> Pass </Result> </student> </class>
Java JDOM Parser — Обзор
JDOM — это библиотека на основе Java с открытым исходным кодом для анализа XML-документов. Обычно это дружественный к Java API-интерфейс. Он оптимизирован для Java и использует коллекции Java, такие как List и Arrays.
JDOM работает с DOM и SAX API и сочетает в себе лучшее из двух. Он занимает мало памяти и почти так же быстр, как SAX.
Настройка среды
Чтобы использовать анализатор JDOM, у вас должен быть jdom.jar в пути к классу вашего приложения. Загрузите jdom-2.0.5.zip.
Когда использовать?
Вы должны использовать парсер JDOM, когда —
-
Вам нужно много знать о структуре XML-документа.
-
Вам необходимо перемещать части документа XMl (например, вы можете отсортировать определенные элементы).
-
Вам необходимо использовать информацию в документе XML более одного раза.
-
Вы являетесь разработчиком Java и хотите использовать оптимизированный для Java синтаксический анализ XML.
Вам нужно много знать о структуре XML-документа.
Вам необходимо перемещать части документа XMl (например, вы можете отсортировать определенные элементы).
Вам необходимо использовать информацию в документе XML более одного раза.
Вы являетесь разработчиком Java и хотите использовать оптимизированный для Java синтаксический анализ XML.
Что вы получаете?
Когда вы анализируете документ XML с помощью синтаксического анализатора JDOM, вы получаете гибкость, чтобы получить древовидную структуру, которая содержит все элементы вашего документа, не влияя на объем памяти приложения.
JDOM предоставляет множество служебных функций, которые можно использовать для проверки содержимого и структуры документа XML в случае, если документ хорошо структурирован и его структура известна.
преимущества
JDOM предоставляет разработчикам Java гибкость и простоту обслуживания кода синтаксического анализа XML. Это легкий и быстрый API.
Классы JDOM
JDOM определяет несколько классов Java. Вот самые распространенные занятия —
-
Документ — представляет весь документ XML. Объект Document часто называют деревом DOM.
-
Элемент — представляет элемент XML. Элемент объекта имеет методы для управления его дочерними элементами, его текстом, атрибутами и пространствами имен.
-
Атрибут — представляет атрибут элемента. Атрибут имеет метод для получения и установки значения атрибута. У него есть родительский тип и тип атрибута.
-
Текст — представляет текст тега XML.
-
Комментарий — представляет комментарии в документе XML.
Документ — представляет весь документ XML. Объект Document часто называют деревом DOM.
Элемент — представляет элемент XML. Элемент объекта имеет методы для управления его дочерними элементами, его текстом, атрибутами и пространствами имен.
Атрибут — представляет атрибут элемента. Атрибут имеет метод для получения и установки значения атрибута. У него есть родительский тип и тип атрибута.
Текст — представляет текст тега XML.
Комментарий — представляет комментарии в документе XML.
Общие методы JDOM
Когда вы работаете с JDOM, вы часто будете использовать несколько методов:
-
SAXBuilder.build (xmlSource) () — создать документ JDOM из источника xml.
-
Document.getRootElement () — Получить корневой элемент XML.
-
Element.getName () — Получить имя узла XML.
-
Element.getChildren () — Получить все прямые дочерние узлы элемента.
-
Node.getChildren (Name) — получает все прямые дочерние узлы с заданным именем.
-
Node.getChild (Name) — Получить первый дочерний узел с заданным именем.
SAXBuilder.build (xmlSource) () — создать документ JDOM из источника xml.
Document.getRootElement () — Получить корневой элемент XML.
Element.getName () — Получить имя узла XML.
Element.getChildren () — Получить все прямые дочерние узлы элемента.
Node.getChildren (Name) — получает все прямые дочерние узлы с заданным именем.
Node.getChild (Name) — Получить первый дочерний узел с заданным именем.
Java JDOM Parser — разбирать XML-документ
Шаги к использованию JDOM
Ниже приведены шаги, используемые при синтаксическом анализе документа с использованием JDOM Parser.
- Импорт пакетов, связанных с XML.
- Создать SAXBuilder
- Создать документ из файла или потока
- Извлечь корневой элемент
- Изучить атрибуты
- Изучить подэлементы
Импорт пакетов, связанных с XML
import java.io.*; import java.util.*; import org.jdom2.*;
Создать DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
Создать документ из файла или потока
File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile);
Извлечь корневой элемент
Element classElement = document.getRootElement();
Изучить атрибуты
//returns specific attribute getAttribute("attributeName");
Изучить подэлементы
//returns a list of subelements of specified name getChildren("subelementName"); //returns a list of all child nodes getChildren(); //returns first child node getChild("subelementName");
Демо-пример
Вот входной 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DomParserDemo.java
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; public class JDomParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Element> studentList = classElement.getChildren(); System.out.println("----------------------------"); for (int temp = 0; temp < studentList.size(); temp++) { Element student = studentList.get(temp); System.out.println("\nCurrent Element :" + student.getName()); Attribute attribute = student.getAttribute("rollno"); System.out.println("Student roll no : " + attribute.getValue() ); System.out.println("First Name : " + student.getChild("firstname").getText()); System.out.println("Last Name : " + student.getChild("lastname").getText()); System.out.println("Nick Name : " + student.getChild("nickname").getText()); System.out.println("Marks : " + student.getChild("marks").getText()); } } catch(JDOMException e) { e.printStackTrace(); } catch(IOException ioe) { ioe.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 : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95 Current Element :student Student roll no : 593 First Name : jasvir Last Name : singn Nick Name : jazz Marks : 90
Java JDOM 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
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; public class QueryXmlFileDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Element> supercarList = classElement.getChildren("supercars"); System.out.println("----------------------------"); for (int temp = 0; temp < supercarList.size(); temp++) { Element supercarElement = supercarList.get(temp); System.out.println("\nCurrent Element :" + supercarElement.getName()); Attribute attribute = supercarElement.getAttribute("company"); System.out.println("company : " + attribute.getValue() ); List<Element> carNameList = supercarElement.getChildren("carname"); for (int count = 0; count < carNameList.size(); count++) { Element carElement = carNameList.get(count); System.out.print("car name : "); System.out.println(carElement.getText()); System.out.print("car type : "); Attribute typeAttribute = carElement.getAttribute("type"); if(typeAttribute != null) System.out.println(typeAttribute.getValue()); else { System.out.println(""); } } } } catch(JDOMException e) { e.printStackTrace(); } catch(IOException ioe) { ioe.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 :
Java JDOM Parser — Создание XML-документа
Демо-пример
Вот XML-файл, который нам нужно создать —
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
CreateXmlFileDemo.java
import java.io.IOException; import org.jdom2.Attribute; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.output.Format; import org.jdom2.output.XMLOutputter; public class CreateXmlFileDemo { public static void main(String[] args) { try{ //root element Element carsElement = new Element("cars"); Document doc = new Document(carsElement); //supercars element Element supercarElement = new Element("supercars"); supercarElement.setAttribute(new Attribute("company","Ferrari")); //supercars element Element carElement1 = new Element("carname"); carElement1.setAttribute(new Attribute("type","formula one")); carElement1.setText("Ferrari 101"); Element carElement2 = new Element("carname"); carElement2.setAttribute(new Attribute("type","sports")); carElement2.setText("Ferrari 202"); supercarElement.addContent(carElement1); supercarElement.addContent(carElement2); doc.getRootElement().addContent(supercarElement); XMLOutputter xmlOutput = new XMLOutputter(); // display ml xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(doc, System.out); } catch(IOException e) { e.printStackTrace(); } } }
Это даст следующий результат —
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
Java JDOM Parser — Изменить 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
import java.io.File; import java.io.IOException; import java.util.List; import org.jdom2.Attribute; 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 ModifyXMLFileDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile); Element rootElement = document.getRootElement(); //get first supercar Element supercarElement = rootElement.getChild("supercars"); // update supercar attribute Attribute attribute = supercarElement.getAttribute("company"); attribute.setValue("Lamborigini"); // loop the supercar child node List<Element> list = supercarElement.getChildren(); for (int temp = 0; temp < list.size(); temp++) { Element carElement = list.get(temp); if("Ferrari 101".equals(carElement.getText())) { carElement.setText("Lamborigini 001"); } if("Ferrari 202".equals(carElement.getText())) { carElement.setText("Lamborigini 002"); } } //get all supercars element List<Element> supercarslist = rootElement.getChildren(); for (int temp = 0; temp < supercarslist.size(); temp++) { Element tempElement = supercarslist.get(temp); if("luxurycars".equals(tempElement.getName())) { rootElement.removeContent(tempElement); } } XMLOutputter xmlOutput = new XMLOutputter(); // display xml xmlOutput.setFormat(Format.getPrettyFormat()); xmlOutput.output(document, System.out); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Это даст следующий результат —
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Lamborigini"> <carname type = "formula one">Lamborigini 001</carname> <carname type = "sports">Lamborigini 002</carname> </supercars> </cars>
Java StAX Parser — Обзор
StAX — это API на основе Java для анализа XML-документа аналогично SAX-анализатору. Но есть два основных различия между двумя API —
-
StAX — это API-интерфейс PULL, а SAX — это API-интерфейс PUSH. Это означает, что в случае синтаксического анализатора StAX клиентское приложение должно запрашивать синтаксический анализатор StAX для получения информации из XML всякий раз, когда это необходимо. Но в случае парсера SAX клиентское приложение должно получать информацию, когда парсер SAX уведомляет клиентское приложение о том, что информация доступна.
-
StAX API может читать и писать документы XML. Используя SAX API, XML-файл можно только читать.
StAX — это API-интерфейс PULL, а SAX — это API-интерфейс PUSH. Это означает, что в случае синтаксического анализатора StAX клиентское приложение должно запрашивать синтаксический анализатор StAX для получения информации из XML всякий раз, когда это необходимо. Но в случае парсера SAX клиентское приложение должно получать информацию, когда парсер SAX уведомляет клиентское приложение о том, что информация доступна.
StAX API может читать и писать документы XML. Используя SAX API, XML-файл можно только читать.
Настройка среды
Чтобы использовать анализатор StAX, у вас должен быть stax.jar в пути к классу вашего приложения.
Ниже приведены функции 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) — записывает атрибуты в элемент.
Java 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</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: Vaneet Last Name: Gupta Nick Name: vinni Marks: 95 End Element : student Start Element : student Roll No : 593 First Name: jasvir Last Name: singn Nick Name: jazz Marks: 90 End Element : student
Анализатор Java StAX — запрос 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</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
Java 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>
Java 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>Vaneet</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(); } } }
Это даст следующий результат —
<?xml version = "1.0" encoding = "UTF-8"?> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>80</marks> </student> <student rollno = "493"> <firstname>Vaneet</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>
Java XPath Parser — Обзор
XPath является официальной рекомендацией Консорциума World Wide Web (W3C). Он определяет язык для поиска информации в файле XML. Он используется для обхода элементов и атрибутов XML-документа. XPath предоставляет различные типы выражений, которые можно использовать для запроса соответствующей информации из документа XML.
Что такое XPath?
-
Определения структуры — XPath определяет части документа XML, такие как элемент, атрибут, текст, пространство имен, инструкция обработки, комментарий и узлы документа.
-
Выражения пути — XPath предоставляет мощные выражения пути, такие как выбранные узлы или список узлов в документах XML.
-
Стандартные функции — XPath предоставляет богатую библиотеку стандартных функций для манипулирования строковыми значениями, числовыми значениями, сравнения даты и времени, манипулирования узлами и QName, манипулирования последовательностями, логическими значениями и т. Д.
-
Основная часть XSLT — XPath является одним из основных элементов в стандарте XSLT, и для работы с документами XSLT необходимо обладать достаточными знаниями XPath.
-
Рекомендация W3C — XPath является официальной рекомендацией Консорциума World Wide Web (W3C).
Определения структуры — XPath определяет части документа XML, такие как элемент, атрибут, текст, пространство имен, инструкция обработки, комментарий и узлы документа.
Выражения пути — XPath предоставляет мощные выражения пути, такие как выбранные узлы или список узлов в документах XML.
Стандартные функции — XPath предоставляет богатую библиотеку стандартных функций для манипулирования строковыми значениями, числовыми значениями, сравнения даты и времени, манипулирования узлами и QName, манипулирования последовательностями, логическими значениями и т. Д.
Основная часть XSLT — XPath является одним из основных элементов в стандарте XSLT, и для работы с документами XSLT необходимо обладать достаточными знаниями XPath.
Рекомендация W3C — XPath является официальной рекомендацией Консорциума World Wide Web (W3C).
Выражения XPath
XPath использует выражение пути для выбора узла или списка узлов в документе XML. Ниже приведен список полезных путей и выражений для выбора любого узла / списка узлов из XML-документа.
Sr.No. | Выражение и описание |
---|---|
1 |
имя-узла Выберите все узлы с заданным именем «nodename» |
2 |
/ Выбор начинается с корневого узла |
3 |
// Выбор начинается с текущего узла, соответствующего выбору |
4 |
, Выбирает текущий узел |
5 |
.. Выбирает родителя текущего узла |
6 |
@ Выбирает атрибуты |
7 |
ученик Пример — выбираются все узлы с именем «студент» |
8 |
класс / студент Пример — выбираются все элементы ученика, которые являются потомками класса |
9 |
//ученик Выбирает все элементы ученика независимо от того, где они находятся в документе |
имя-узла
Выберите все узлы с заданным именем «nodename»
/
Выбор начинается с корневого узла
//
Выбор начинается с текущего узла, соответствующего выбору
,
Выбирает текущий узел
..
Выбирает родителя текущего узла
@
Выбирает атрибуты
ученик
Пример — выбираются все узлы с именем «студент»
класс / студент
Пример — выбираются все элементы ученика, которые являются потомками класса
//ученик
Выбирает все элементы ученика независимо от того, где они находятся в документе
Предикаты
Предикаты используются для поиска определенного узла или узла, содержащего определенное значение, и определяются с помощью […].
выражение | Результат |
---|---|
/ Класс / студент [1] | Выбирает первый элемент ученика, который является дочерним элементом элемента класса. |
/ Класс / студент [последняя ()] | Выбирает последний элемент студента, который является дочерним элементом элемента класса. |
/ Класс / студент [последняя () — 1] | Выбирает последний, кроме одного студенческого элемента, который является дочерним элементом элемента класса. |
// студент [@rollno = ‘493’] | Выбирает все элементы ученика, которые имеют атрибут с именем rollno со значением ‘493’ |
Java XPath Parser — Разбор XML-документа
Шаги к использованию XPath
Ниже приведены шаги, используемые при анализе документа с использованием XPath Parser.
-
Импорт пакетов, связанных с XML.
-
Создать DocumentBuilder.
-
Создать документ из файла или потока.
-
Создайте объект Xpath и выражение пути XPath.
-
Скомпилируйте выражение XPath с помощью XPath.compile () и получите список узлов, оценив скомпилированное выражение с помощью XPath.evaluate () .
-
Переберите список узлов.
-
Изучите атрибуты.
-
Изучите подэлементы.
Импорт пакетов, связанных с XML.
Создать DocumentBuilder.
Создать документ из файла или потока.
Создайте объект Xpath и выражение пути XPath.
Скомпилируйте выражение XPath с помощью XPath.compile () и получите список узлов, оценив скомпилированное выражение с помощью XPath.evaluate () .
Переберите список узлов.
Изучите атрибуты.
Изучите подэлементы.
Импорт пакетов, связанных с XML
import org.w3c.dom.*; import org.xml.sax.*; import javax.xml.parsers.*; import javax.xml.xpath.*; 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);
Сборка XPath
XPath xPath = XPathFactory.newInstance().newXPath();
Подготовьте путь выражения и оцените его
String expression = "/class/student"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET);
Итерировать по NodeList
for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); ... }
Изучить атрибуты
//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 version = "1.0"?> <class> <student rollno = "393"> <firstname>dinkar</firstname> <lastname>kad</lastname> <nickname>dinkar</nickname> <marks>85</marks> </student> <student rollno = "493"> <firstname>Vaneet</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>
XPathParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class XPathParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); String expression = "/class/student"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); 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 (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } }
Это даст следующий результат —
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 : Vaneet 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
Java XPath Parser — Запрос 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
XPathParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.IOException; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.ParserConfigurationException; import javax.xml.xpath.XPath; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; import org.w3c.dom.Document; import org.w3c.dom.NodeList; import org.w3c.dom.Node; import org.w3c.dom.Element; import org.xml.sax.SAXException; public class XPathParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder dBuilder; dBuilder = dbFactory.newDocumentBuilder(); Document doc = dBuilder.parse(inputFile); doc.getDocumentElement().normalize(); XPath xPath = XPathFactory.newInstance().newXPath(); String expression = "/class/student[@rollno = '493']"; NodeList nodeList = (NodeList) xPath.compile(expression).evaluate( doc, XPathConstants.NODESET); for (int i = 0; i < nodeList.getLength(); i++) { Node nNode = nodeList.item(i); 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 (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (XPathExpressionException e) { e.printStackTrace(); } } }
Это даст следующий результат —
Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta Nick Name : vinni Marks : 95
Java XPath Parser — Создание XML-документа
Парсер XPath используется только для навигации по документам XML. Для создания XML лучше использовать DOM-парсер. Пожалуйста, обратитесь к разделу Java DOM Parser для того же.
Java XPath Parser — Изменить XML-документ
Парсер XPath используется только для навигации по документам XML. Для изменения XML лучше использовать DOM-парсер. Пожалуйста, обратитесь к разделу Java DOM Parser для того же.
Java DOM4J Parser — Обзор
DOM4J — это библиотека на основе Java с открытым исходным кодом для анализа XML-документов. Это очень гибкий и энергоэффективный API. Он оптимизирован для Java и использует коллекции Java, такие как List и Arrays.
DOM4J работает с DOM, SAX, XPath и XSLT. Он может анализировать большие XML-документы с очень низким объемом памяти.
Настройка среды
Чтобы использовать анализатор DOM4J, вы должны иметь dom4j-1.6.1.jar и jaxen.jar в пути к классам вашего приложения. Скачайте dom4j-1.6.1.zip.
Когда использовать?
Вы должны использовать парсер DOM4J, когда —
-
Вам нужно много знать о структуре XML-документа.
-
Вам нужно перемещать части XML-документа (например, вы можете отсортировать определенные элементы).
-
Вам необходимо использовать информацию в документе XML более одного раза.
-
Вы — разработчик Java и хотите использовать оптимизированный для Java синтаксический анализ XML.
Вам нужно много знать о структуре XML-документа.
Вам нужно перемещать части XML-документа (например, вы можете отсортировать определенные элементы).
Вам необходимо использовать информацию в документе XML более одного раза.
Вы — разработчик Java и хотите использовать оптимизированный для Java синтаксический анализ XML.
Что вы получаете?
Когда вы анализируете документ XML с помощью синтаксического анализатора DOM4J, вы получаете гибкость, чтобы получить древовидную структуру, которая содержит все элементы вашего документа без влияния на объем памяти приложения.
DOM4J предоставляет множество служебных функций, которые можно использовать для проверки содержимого и структуры документа XML в случае, если документ хорошо структурирован и его структура известна.
DOM4J использует выражение XPath для навигации по документу XML.
преимущества
DOM4J предоставляет разработчикам Java гибкость и простоту обслуживания кода синтаксического анализа XML. Это легкий и быстрый API.
DOM4J Классы
DOM4J определяет несколько классов Java. Вот самые распространенные занятия —
-
Документ — представляет весь документ XML. Объект Document часто называют деревом DOM.
-
Элемент — представляет элемент XML. Элемент объекта имеет методы для управления его дочерними элементами, текстом, атрибутами и пространствами имен.
-
Атрибут — представляет атрибут элемента. Атрибут имеет метод для получения и установки значения атрибута. У него есть родительский тип и тип атрибута.
-
Узел — представляет элемент, атрибут или инструкцию обработки.
Документ — представляет весь документ XML. Объект Document часто называют деревом DOM.
Элемент — представляет элемент XML. Элемент объекта имеет методы для управления его дочерними элементами, текстом, атрибутами и пространствами имен.
Атрибут — представляет атрибут элемента. Атрибут имеет метод для получения и установки значения атрибута. У него есть родительский тип и тип атрибута.
Узел — представляет элемент, атрибут или инструкцию обработки.
Общие методы DOM4J
Когда вы работаете с DOM4J, вы часто будете использовать несколько методов:
-
SAXReader.read (xmlSource) () — Сборка документа DOM4J из источника XML.
-
Document.getRootElement () — Получить корневой элемент документа XML.
-
Element.node (index) — получает узел XML по определенному индексу в элементе.
-
Element.attributes () — Получить все атрибуты элемента.
-
Node.valueOf (@Name) — Получить значения атрибута с заданным именем элемента.
SAXReader.read (xmlSource) () — Сборка документа DOM4J из источника XML.
Document.getRootElement () — Получить корневой элемент документа XML.
Element.node (index) — получает узел XML по определенному индексу в элементе.
Element.attributes () — Получить все атрибуты элемента.
Node.valueOf (@Name) — Получить значения атрибута с заданным именем элемента.
Java DOM4J Parser — разбирать XML-документ
Шаги к использованию DOM4J
Ниже приведены шаги, используемые при разборе документа с использованием DOM4J Parser.
-
Импорт пакетов, связанных с XML.
-
Создайте SAXReader.
-
Создать документ из файла или потока.
-
Получите необходимые узлы, используя выражение XPath, вызвав document.selectNodes ()
-
Извлеките корневой элемент.
-
Переберите список узлов.
-
Изучите атрибуты.
-
Изучите подэлементы.
Импорт пакетов, связанных с XML.
Создайте SAXReader.
Создать документ из файла или потока.
Получите необходимые узлы, используя выражение XPath, вызвав document.selectNodes ()
Извлеките корневой элемент.
Переберите список узлов.
Изучите атрибуты.
Изучите подэлементы.
Импорт пакетов, связанных с XML
import java.io.*; import java.util.*; import org.dom4j.*;
Создать DocumentBuilder
SAXBuilder saxBuilder = new SAXBuilder();
Создать документ из файла или потока
File inputFile = new File("input.txt"); SAXBuilder saxBuilder = new SAXBuilder(); Document document = saxBuilder.build(inputFile);
Извлечь корневой элемент
Element classElement = document.getRootElement();
Изучить атрибуты
//returns specific attribute valueOf("@attributeName");
Изучить подэлементы
//returns first child node selectSingleNode("subelementName");
Демо-пример
Вот входной 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DOM4JParserDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class DOM4JParserDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXReader reader = new SAXReader(); Document document = reader.read( inputFile ); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Node> nodes = document.selectNodes("/class/student" ); System.out.println("----------------------------"); for (Node node : nodes) { System.out.println("\nCurrent Element :" + node.getName()); System.out.println("Student roll no : " + node.valueOf("@rollno") ); System.out.println("First Name : " + node.selectSingleNode("firstname").getText()); System.out.println("Last Name : " + node.selectSingleNode("lastname").getText()); System.out.println("First Name : " + node.selectSingleNode("nickname").getText()); System.out.println("Marks : " + node.selectSingleNode("marks").getText()); } } catch (DocumentException e) { e.printStackTrace(); } } }
Это даст следующий результат —
Root element :class ---------------------------- Current Element :student Student roll no : First Name : dinkar Last Name : kad First Name : dinkar Marks : 85 Current Element :student Student roll no : First Name : Vaneet Last Name : Gupta First Name : vinni Marks : 95 Current Element :student Student roll no : First Name : jasvir Last Name : singn First Name : jazz Marks : 90
Java DOM4J 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DOM4JQueryDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.SAXReader; public class DOM4JQueryDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXReader reader = new SAXReader(); Document document = reader.read( inputFile ); System.out.println("Root element :" + document.getRootElement().getName()); Element classElement = document.getRootElement(); List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" ); System.out.println("----------------------------"); for (Node node : nodes) { System.out.println("\nCurrent Element :" + node.getName()); System.out.println("Student roll no : " + node.valueOf("@rollno") ); System.out.println("First Name : " + node.selectSingleNode("firstname").getText()); System.out.println("Last Name : " + node.selectSingleNode("lastname").getText()); System.out.println("First Name : " + node.selectSingleNode("nickname").getText()); System.out.println("Marks : " + node.selectSingleNode("marks").getText()); } } catch (DocumentException e) { e.printStackTrace(); } } }
Это даст следующий результат —
Root element :class ---------------------------- Current Element :student Student roll no : 493 First Name : Vaneet Last Name : Gupta First Name : vinni Marks : 95
Java DOM4J Parser — Создание XML-документа
Демо-пример
Вот XML, который нам нужно создать —
<?xml version = "1.0" encoding = "UTF-8"?> <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 java.io.IOException; import java.io.UnsupportedEncodingException; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; public class DOM4JCreateXMLDemo { public static void main(String[] args) { try { Document document = DocumentHelper.createDocument(); Element root = document.addElement( "cars" ); Element supercarElement = root.addElement("supercars") .addAttribute("company", "Ferrai"); supercarElement.addElement("carname") .addAttribute("type", "Ferrari 101") .addText("Ferrari 101"); supercarElement.addElement("carname") .addAttribute("type", "sports") .addText("Ferrari 202"); // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer; writer = new XMLWriter( System.out, format ); writer.write( document ); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Это даст следующий результат —
<?xml version = "1.0" encoding = "UTF-8"?> <cars> <supercars company = "Ferrari"> <carname type = "formula one">Ferrari 101</carname> <carname type = "sports">Ferrari 202</carname> </supercars> </cars>
Java DOM4J 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>Vaneet</firstname> <lastname>Gupta</lastname> <nickname>vinni</nickname> <marks>95</marks> </student> <student rollno = "593"> <firstname>jasvir</firstname> <lastname>singn</lastname> <nickname>jazz</nickname> <marks>90</marks> </student> </class>
DOM4jModifyXMLDemo.java
package com.tutorialspoint.xml; import java.io.File; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.List; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.Node; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; public class DOM4jModifyXMLDemo { public static void main(String[] args) { try { File inputFile = new File("input.txt"); SAXReader reader = new SAXReader(); Document document = reader.read( inputFile ); Element classElement = document.getRootElement(); List<Node> nodes = document.selectNodes("/class/student[@rollno = '493']" ); for (Node node : nodes) { Element element = (Element)node; Iterator<Element> iterator = element.elementIterator("marks"); while(iterator.hasNext()) { Element marksElement = (Element)iterator.next(); marksElement.setText("80"); } } // Pretty print the document to System.out OutputFormat format = OutputFormat.createPrettyPrint(); XMLWriter writer; writer = new XMLWriter( System.out, format ); writer.write( document ); } catch (DocumentException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
Это даст следующий результат —