Java API для обработки XML - Java API for XML Processing

В вычислении , то Java API для XML - обработки , или JAXP ( / æ к s р я / Jaks -pee ), один из Java XML интерфейсов программирования приложений , обеспечивает возможность проверки и разбора XML - документов. Он имеет три основных интерфейса синтаксического анализа:

В дополнение к интерфейсам синтаксического анализа API предоставляет интерфейс XSLT для предоставления данных и структурных преобразований в XML-документе.

JAXP был разработан в рамках процесса сообщества Java как JSR 5 (JAXP 1.0), JSR 63 (JAXP 1.1 и 1.2) и JSR 206 (JAXP 1.3).

Версия Java SE Версия 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

JAXP версия 1.4.4 была выпущена 3 сентября 2010 года JAXP 1,3 был объявлен окончанием срока службы на 12 февраля 2008 года.

DOM интерфейс

Интерфейс DOM анализирует весь XML-документ и создает полное представление документа в памяти, используя классы и моделируя концепции, найденные в базовой спецификации уровня 2 объектной модели документа.

Парсер DOM называется a DocumentBuilder, поскольку он строит представление в памяти Document. Javax.xml.parsers.DocumentBuilder создается javax.xml.parsers.DocumentBuilderFactory. DocumentBuilderСоздает org.w3c.dom.Documentэкземпляр - древовидная структура , содержащая узлов в XML - документе. Каждый узел дерева в структуре реализует org.w3c.dom.Nodeинтерфейс. Среди множества различных типов узлов дерева, каждый из которых представляет тип данных, обнаруженных в документе XML, наиболее важными являются:

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

SAX интерфейс

Javax.xml.parsers.SAXParserFactory создает синтаксический анализатор SAX, называемый SAXParser. В отличие от парсера DOM, парсер SAX не создает представление XML-документа в памяти, поэтому работает быстрее и использует меньше памяти. Вместо этого синтаксический анализатор SAX информирует клиентов о структуре XML-документа, вызывая обратные вызовы, то есть вызывая методы экземпляра org.xml.sax.helpers.DefaultHandler, предоставленного синтаксическому анализатору. Этот способ доступа к документу называется потоковой передачей XML .

В DefaultHandlerклассе реализует ContentHandler, то ErrorHandler, то DTDHandler, и интерфейсы EntityResolver. Большинство клиентов будут заинтересованы в методах, определенных в ContentHandlerинтерфейсе, которые вызываются, когда синтаксический анализатор SAX встречает соответствующие элементы в XML-документе. Наиболее важные методы в этом интерфейсе:

  • startDocument()и endDocument()методы, вызываемые в начале и в конце XML-документа.
  • startElement()и endElement()методы, которые вызываются в начале и в конце элемента документа.
  • characters() метод, который вызывается с содержимым текстовых данных, содержащимся между начальным и конечным тегами элемента XML-документа.

Клиенты предоставляют подкласс, DefaultHandlerкоторый переопределяет эти методы и обрабатывает данные. Это может включать сохранение данных в базе данных или их запись в поток.

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

Это было представлено в Java 1.3 в мае 2000 года.

Интерфейс StAX

StAX был разработан как посредник между интерфейсом DOM и SAX. В его метафоре программная точка входа - это курсор, который представляет точку в документе. Приложение перемещает курсор вперед - «вытягивая» информацию из парсера по мере необходимости. Это отличается от API, основанного на событиях, такого как SAX, который «подталкивает» данные к приложению, требуя, чтобы приложение поддерживало состояние между событиями по мере необходимости для отслеживания местоположения в документе.

XSLT-интерфейс

X ML S tylesheet L anguage для T ransformations или XSLT , позволяет для преобразования документа XML в другие виды данных. JAXP предоставляет интерфейсы в пакете javax.xml.transform, позволяя приложениям вызывать преобразование XSLT. Этот интерфейс первоначально назывался TrAX (API преобразования для XML) и был разработан в результате неформального сотрудничества между разработчиками ряда процессоров Java XSLT.

Основные особенности интерфейса:

  • фабричный класс, позволяющий приложению динамически выбирать, какой XSLT-процессор он хочет использовать (TransformerFactory, TransformerFactory.NewInstance (), TransformerFactory.newInstance (java.lang.String, _java.lang.ClassLoader)).
  • методы в фабричном классе для создания объекта Templates, представляющего скомпилированную форму таблицы стилей. Это потокобезопасный объект, который можно использовать многократно, последовательно или параллельно для применения одной и той же таблицы стилей к нескольким исходным документам (или к одному и тому же исходному документу с разными параметрами) (TransformerFactory.newTemplates (javax.xml.transform. Source), а также TransformerFactory.newTransformer (javax.xml.transform.Source), TransformerFactory.newTransformer ()), метод объекта Templates для создания Transformer, представляющий исполняемую форму таблицы стилей (Templates.newTransformer ()) Это не может быть разделен между потоками, хотя его можно многократно использовать последовательно. Преобразователь предоставляет методы для установки параметров таблицы стилей и параметров сериализации (например, должен ли вывод быть с отступом), а также метод для фактического запуска преобразования. (Transformer.transform (javax.xml.transform.Source, _javax.xml.transform.Result)).

Два абстрактных интерфейса Source и Result определены для представления ввода и вывода преобразования. Это несколько нетрадиционное использование интерфейсов Java, поскольку не ожидается, что процессор примет любой класс, реализующий интерфейс - каждый процессор может выбирать, какие типы источника или результата он готов обрабатывать. На практике все процессоры JAXP поддерживают три стандартных вида источника ( 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 {
      String xsltResource = 
         "<?xml version='1.0' encoding='UTF-8'?>\n"+
         "<xsl:stylesheet version='2.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>\n"+
         "   <xsl:output method='xml' indent='no'/>\n"+
         "   <xsl:template match='/'>\n"+
         "      <reRoot><reNode><xsl:value-of select='/root/node/@val' /> world</reNode></reRoot>\n"+
         "   </xsl:template>\n"+
         "</xsl:stylesheet>";
      String xmlSourceResource =
         "<?xml version='1.0' encoding='UTF-8'?>\n"+
         "<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>

использованная литература

внешние ссылки