Java API для обработки XML
В этой статье есть несколько проблем. Пожалуйста, помогите улучшить его или обсудите эти проблемы на странице обсуждения . ( Узнайте, как и когда удалять эти шаблонные сообщения )
|
В вычислениях Java API для обработки XML ( JAXP ) ( / ˈ dʒ æ k s p iː / JAKS -pee ), один из Java XML интерфейсов прикладного программирования (API), обеспечивает возможность проверки и анализа XML- документов. Он имеет три основных интерфейса синтаксического анализа:
- интерфейс анализа объектной модели документа или DOM интерфейс
- Простой API для интерфейса синтаксического анализа XML или SAX интерфейса
- интерфейс Streaming API для XML или StAX (часть JDK 6; для JDK 5 доступен отдельный jar)
В дополнение к интерфейсам синтаксического анализа API предоставляет интерфейс XSLT для предоставления данных и структурных преобразований в XML-документе.
JAXP был разработан в рамках процесса сообщества Java как JSR 5 (JAXP 1.0), JSR 63 (JAXP 1.1 и 1.2) и JSR 206 (JAXP 1.3).
SE Java -версия | Версия JAXP в комплекте |
---|---|
1.4 | 1.1 |
1.5 | 1.3 |
1.6 | 1.4 |
1.7.0 | 1.4.5 |
1.7.40 | 1.5 |
1.8 | 1.6 [ 1 ] |
Версия JAXP 1.4.4 была выпущена 3 сентября 2010 г. Срок службы JAXP 1.3 был объявлен 12 февраля 2008 г.
DOM-интерфейс
[ редактировать ]Интерфейс DOM анализирует весь XML-документ и создает полное представление документа в памяти, используя классы и моделируя концепции, найденные в базовой спецификации объектной модели документа уровня 2.
Парсер DOM называется DocumentBuilder
, поскольку он создает в памяти Document
представительство. javax.xml.parsers.DocumentBuilder
создается javax.xml.parsers.DocumentBuilderFactory
. [ 2 ] DocumentBuilder
создает org.w3c.dom.Document
экземпляр — древовидная структура, содержащая узлы в XML-документе. Каждый узел дерева в структуре реализует org.w3c.dom.Node
интерфейс. Среди множества различных типов узлов дерева, каждый из которых представляет тип данных, содержащихся в XML-документе, наиболее важными являются:
- узлы элементов, которые могут иметь атрибуты
- текстовые узлы, представляющие текст, найденный между начальным и конечным тегами элемента документа.
SAX-интерфейс
[ редактировать ]The javax.xml.parsers.SAXParserFactory
создает парсер SAX, называемый SAXParser
. В отличие от анализатора DOM, анализатор SAX не создает представление XML-документа в памяти и поэтому работает быстрее и использует меньше памяти. Вместо этого анализатор SAX информирует клиентов о структуре XML-документа, вызывая обратные вызовы, то есть вызывая методы в DefaultHandler
экземпляр, предоставленный синтаксическому анализатору. Этот способ доступа к документу называется потоковой передачей XML .
The DefaultHandler
класс реализует ContentHandler
, ErrorHandler
, DTDHandler
и EntityResolver
интерфейсы. Большинству клиентов будут интересны методы, определенные в ContentHandler
интерфейс, который вызывается, когда анализатор SAX обнаруживает соответствующие элементы в документе XML. Наиболее важными методами в этом интерфейсе являются:
startDocument()
иendDocument()
методы, которые вызываются в начале и конце XML-документа.startElement()
иendElement()
методы, которые вызываются в начале и конце элемента документа.characters()
метод, который вызывается с текстовыми данными, содержащимися между начальным и конечным тегами элемента XML-документа.
Клиенты предоставляют подкласс DefaultHandler
который переопределяет эти методы и обрабатывает данные. Это может включать сохранение данных в базе данных или запись их в поток.
Во время анализа синтаксическому анализатору может потребоваться доступ к внешним документам. Можно хранить локальный кэш для часто используемых документов с помощью XML-каталога .
Это было представлено в Java 1.3 в мае 2000 года. [ 3 ]
интерфейс StAX
[ редактировать ]StAX был разработан как нечто среднее между интерфейсами DOM и SAX. В своей метафоре программная точка входа — это курсор, который представляет точку внутри документа. Приложение перемещает курсор вперед — «подтягивая» информацию из парсера так, как ему нужно. Это отличается от API, основанного на событиях, такого как SAX, который «пересылает» данные в приложение, требуя от приложения поддерживать состояние между событиями по мере необходимости, чтобы отслеживать местоположение в документе.
XSLT-интерфейс
[ редактировать ]Язык для стилей XML таблиц . данных преобразований , или XSLT , позволяет преобразовывать XML-документ в другие формы JAXP предоставляет интерфейсы в пакете javax.xml.transform
разрешение приложениям вызывать преобразование XSLT. Этот интерфейс первоначально назывался TrAX (API преобразования для XML) и был разработан в результате неофициального сотрудничества разработчиков ряда процессоров Java XSLT.
Основные особенности интерфейса:
- фабричный класс, позволяющий приложению динамически выбирать, какой процессор XSLT оно желает использовать (
TransformerFactory
,TransformerFactory.newInstance()
,TransformerFactory.newInstance(String factoryClassName, ClassLoader classLoader)
. - методы фабричного класса для создания
Templates
объект, представляющий скомпилированную форму таблицы стилей. Это поточно-ориентированный объект, который можно использовать повторно, последовательно или параллельно, для применения одной и той же таблицы стилей к нескольким исходным документам (или к одному и тому же исходному документу с разными параметрами) (TransformerFactory.newTemplates(Source source)
), такжеTransformerFactory.newTransformer(Source source)
,TransformerFactory.newTransformer()
), метод наTemplates
объект для созданияjavax.xml.transform.Transformer
, представляющий исполняемую форму таблицы стилей (Templates.newTransformer()
) Его нельзя использовать совместно между потоками, хотя его можно повторно использовать последовательно.Transformer
предоставляет методы для установки параметров таблицы стилей и параметров сериализации (например, должен ли вывод иметь отступ), а также метод для фактического запуска преобразования. (TransformerFactory.transformer(Source xmlSource, Result outputTarget)
).
Два абстрактных интерфейса Source
и Result
определены для представления входных и выходных данных преобразования. Это несколько нетрадиционное использование интерфейсов Java, поскольку не ожидается, что процессор примет какой-либо класс, реализующий интерфейс — каждый процессор может выбирать, какие виды Source
или Result
он готов справиться. На практике все процессоры JAXP поддерживают несколько стандартных типов Source ( DOMSource
, SAXSource
StreamSource
) и несколько стандартных видов Результата ( DOMResult
, SAXResult
StreamResult
) и, возможно, другие собственные реализации.
Пример
[ редактировать ]Самый примитивный, но полный пример запуска XSLT-преобразования может выглядеть так:
/* file src/examples/xslt/XsltDemo.java */
package examples.xslt;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
public class XsltDemo {
public static void main(String[] args) throws TransformerFactoryConfigurationError, TransformerException {
//language=xslt
String xsltResource =
"""
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml' indent='no'/>
<xsl:template match='/'>
<reRoot><reNode><xsl:value-of select='/root/node/@val' /> world</reNode></reRoot>
</xsl:template>
</xsl:stylesheet>
""";
//language=XML
String xmlSourceResource =
"""
<?xml version='1.0' encoding='UTF-8'?>
<root><node val='hello'/></root>
""";
StringWriter xmlResultResource = new StringWriter();
Transformer xmlTransformer = TransformerFactory.newInstance().newTransformer(
new StreamSource(new StringReader(xsltResource))
);
xmlTransformer.transform(
new StreamSource(new StringReader(xmlSourceResource)), new StreamResult(xmlResultResource)
);
System.out.println(xmlResultResource.getBuffer().toString());
}
}
Он применяет следующее жестко запрограммированное преобразование XSLT:
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='xml' indent='no'/>
<xsl:template match='/'>
<reRoot><reNode><xsl:value-of select='/root/node/@val' /> world</reNode></reRoot>
</xsl:template>
</xsl:stylesheet>
К следующему жестко запрограммированному XML-документу:
<?xml version='1.0' encoding='UTF-8'?>
<root><node val='hello'/></root>
Результатом выполнения будет
<?xml version="1.0" encoding="UTF-8"?><reRoot><reNode>hello world</reNode></reRoot>
Цитаты
[ редактировать ]- ^ «Программа Java Community Process (SM) — JSRS: запросы спецификаций Java — подробности JSR# 206» .
- ^ Хорстманн 2022 , §3.3 Анализ XML-документа.
- ^ Сравните индекс API Java 1.2.1 с индексом 1.3 . Запрос спецификации Java (JSR) 5, Спецификация синтаксического анализа XML , был завершен 21 марта 2000 года .
Ссылки
[ редактировать ]- Хорстманн, Кей (15 апреля 2022 г.). CoreJava . Oracle Press Java. ISBN 0-13-787107-4 .