69059

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

Лекция

Информатика, кибернетика и программирование

Стандартизованный набор элементов и атрибутов HTML позволяет создавать программы просмотра (Web-браузеры) и графические редакторы документов HTML, пригодные для обработки любого документа HTML.

Русский

2014-09-29

267.5 KB

1 чел.

 29

Лекция 4-07

Тема 5.2. Обработка документов XML с использованием Java

5.2.1. Обработка документов XML

5.2.2. Синтаксические SAX-анализаторы XML

5.2.3. Реализация DOM XML в языке Java

 5.2.3.1. Доступ к документу XML

 5.2.3.1.1. Класс DocumentBuilder

 5.2.3.1.2. Класс DocumentBuilderFactory

 5.2.3.2. Интерфейсы DOM XML в языке Java

 5.2.3.2.1. Интерфейс DOMImplementation

 5.2.3.2.2. Интерфейс NodeList

 5.2.3.2.3. Интерфейс NamedNodeMap

 5.2.3.2.4. Интерфейс Node

 5.2.3.2.5. Интерфейсы Document, DocumentFragment и DocumentType

 5.2.3.2.6. Интерфейс Element

 5.2.3.2.7. Интерфейс Attr

 5.2.3.2.8. Интерфейсы CharacterData, Text, Comment и CDATASection

 5.2.3.2.9. Интерфейсы Entity, EntityReference, Notation и ProcessingInstruction

 5.2.3.2.10. Исключение DOMException

 5.2.3.3. Средства выполнения преобразований документов XML в языке Java

5.2.3.3.1. Общие средства выполнения преобразований документов XML

 5.2.3.3.2. Средства преобразования для DOM-анализатора

 5.2.3.3.3. Средства преобразования для потоков ввода-вывода

 

 

 

 

 

 

 

 

 

 

 

Тема 5.1. Вспомогательные языки XML

5.2.1. Обработка документов XML

Стандартизованный набор элементов и атрибутов HTML позволяет создавать программы просмотра (Web-браузеры) и графические редакторы документов HTML, пригодные для обработки любого документа HTML.

В отличие от HTML, для документа какого-либо приложения XML необходимо каким-то образом определить обработку этого документа XML, например, формат вывода документа на экран дисплея или на печать.   Самым  общим способом решения этой задачи является создания программы для обработки документов данного приложения. Примером такой программы для документов XML, описываемых с помощью DTD для HTML и XHTML,  является Web-браузер.

Для подготовки структуры и содержания документа к отображению (на экран или на печать)  или к передаче в другое приложение для последующей обработки необходимо выполнить следующие  этапы:

  1.  Создать DTD или схему для документа XML;
  2.  Создать документ XML в соответствии с DTD или схемой;
  3.  Проанализировать, является ли документ правильным (well-formed) и действительным (valid);
  4.  В случае отсутствия ошибок выполнить обработку документа.  

Рассмотрим прикладные и инструментальные программные средства, используемые в приведенных выше этапах.

На первом и втором этапах необходимо создать и отредактировать DTD или схему документа, а также сам документ XML. Поскольку DTD, схема и сам документ являются текстовыми файлами, для их создания и модификации можно использовать любой текстовый редактор, например Блокнот (Notepad) в Windows. Однако лучше воспользоваться для обработки приложения специализированным редактором XML, например, Microsoft XML Notepad. Кроме того, редактор XML входит в состав многих интегрированных средств разработки (IDE) документов XML, например, XMLSpy.

Редакторы XML обычно выполняют следующие основные функции:

  •  поддержка возможности отображения и редактирования документа XML в виде древовидной структуры (основной режим);
  •  поддержка возможности отображения и редактирования документа XML в текстовом виде (вспомогательный режим);
  •  возможность редактирования (вставки, изменения или удаления элементов или атрибутов документа) с учетом DTD (внутреннего или внешнего) или схемы;
  •  поддержка различных кодировок документа.  

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

  •  средства создания и редактирования DTD и схем;
  •  наличие «мастеров» (wizards) для облегчения процесса создания документа XML, DTD и схем;
  •  наличие справочной информации по XML, DTD и схемам.  

Для проверки действительности и правильности документа XML используются так называемые синтаксические анализаторы (parsers).  Существуют два вида синтаксических анализаторов: анализаторы, проверяющие только правильность документа, т.е. соблюдения правил спецификации XML и анализаторы, которые проверяют не только правильность документа, но и его действительность, т.е. соответствие документа своему DTD или своей схеме. Синтаксические анализаторы могут быть самостоятельными приложениями или компонентами IDE или встроенными в приложение XML. В настоящее время существует два основных типа анализаторов XML:

  •  SAX-анализаторы;
  •  DOM-анализаторы.

В общем, обработка документа XML выполняется с помощью индивидуальной программы, разработанной для данного документа XML. Эту программу называют процессором XML (процессором XML также иногда называют программу, которая выполняет и анализ, и обработку документа XML). В некоторых языках программирования имеются средства, облегчающие разработку приложений XML. Ниже будут рассмотрены такие средства для языка Java. Кроме того, для стандартных определенных функциональных задач, например, для форматированного вывода документов XML на экран и печать существуют специальные средства, например, использование таблиц стилей или расширенного языка стилей – XSL (eXtensible Stylesheet Language). Существуют и другие специализированные приложения XML, например, для вывода математических формул – MathML или масштабируемой векторной графики –SVG .

5.2.2. Синтаксические SAX-анализаторы XML 

Простой интерфейс прикладного программирования (API) для XMLSAX  (Simple API for XML) – это  основанный на событиях интерфейс,  предназначенный для анализаторов XML. (точнее сказать, это набор API). Первая спецификация SAXSAX 1.0, была разработана в 1999 году. В настоящее время разработана новая спецификация SAX 2.0.

Событием в SAX называется появление при просмотре документа XML элемента разметки, т.е. открывающего или закрывающего элемента, комментария и т.п. При этом вызываются определенные программистом для каждого события методы, т.е.    интерфейс SAX преобразует анализ документа XML в вызов определенного метода (типа события) с соответствующими параметрами (которые описывают состояние события).

В принципе, SAX-анализаторы и процессоры XML можно реализовать на любом языке программирования, однако наиболее просто такое программирование выполняется на языке Java. В состав Java J2SE и J2EE входят пакеты org.xml.sax, org.xml.sax.ext, org.xml.sax.helpers и javax.xml.parsers для разработки SAX-анализаторов по спецификации 2.0 (SAX2).

Более сложным и вместе с тем более мощным средством является обработка документа XML с использованием средств объектной модели документа – DOM (Document Object Model), реализованной в языке Java.   

5.2.3. Реализация DOM XML в языке Java

5.2.3.1. Доступ к документу XML

Средства реализации DOM-анализаторов на языке Java определены в классах DocumentBuilder и DocumentBuilderFactory пакета javax.xml.parsers.

5.2.3.1.1. Класс DocumentBuilder

Абстрактный класс DocumentBuilder определяет интерфейс прикладного программирования – API (Application Program Interface) для получения экземпляров объекта Document из документа XML.

Основными методами класса DocumentBuilder являются методы анализа документа XML:

public Document parse(File f) throws SAXException,

IOException

public abstract Document parse(InputSource is)

throws SAXException, IOException

public Document parse(InputStream is)

    throws SAXException, IOException

public Document parse(InputStream is, String systemId)

throws SAXException, IOException

public Document parse(String uri) throws SAXException,

IOException

В параметре метода задается источник, в котором содержится документ, представленный как экземпляр одного из классов: File, InputSource или InputStream, либо как обращение  к ресурсу URI.  Параметр в systemId четвертом методе задает системный идентификатор, необходимый для разрешения относительных URI.

Получение экземпляра объекта Document для DOM-анализатора выполняется с помощью одного из методов:

public abstract Document newDocument()

public abstract DOMImplementation getDOMImplementation()

Первый метод прямо получает новый экземпляр объекта Document для построения дерева DOM. Второй метод получает объект DOMImplementation, а затем с помощью методов DOM уровня 2 создается новый объект Document.

Метод

public abstract void setErrorHandler(ErrorHandler eh)

позволяет установить обработчик ошибок для документа XML.

В интерфейсе ErrorHandler пакета org.xml.sax определены следующие методы обработки ошибок:

public void fatalError(SAXParseException exception)

throws SAXException

public void error(SAXParseException exception)

throws SAXException

public void warning(SAXParseException exception)

throws SAXException,

Эти методы обеспечивают получение уведомлений о фатальной ошибке, восстановимой ошибке и предупреждении.

Методы интерфейса ErrorHandler реализованы в классе DefaultHandler. Все эти методы просто бросают исключение SAXParseException. Если необходимо выполнить собственную обработку ошибок, методы обработки ошибок следует переписать в классе, расширяющем класс DefaultHandler.  

Пример реализации собственного метода fatalError()  в классе DefaultHandler документа email.xml:

public void fatalError(SAXParseException spe)

throws SAXParseException {

 System.out.println(spe.getMessage() +

" в строке " + spe.getLineNumber());

 System.exit(1);

}

Если в методе startElement() после оператора if для проверки элемента body вставить следующий фрагмент

else {

fatalError(new SAXParseException(

"Недопустимый дескриптор <" + qname +

">", locator)

);

}

то, при появлении в тексте документа недопустимого дескриптора, например, <Header>, будет выведено сообщение

Недопустимый дескриптор <header> в строке 11

Метод

public abstract void setEntityResolver(EntityResolver er)

позволяет установить обработчик сущностей для документа XML.

Единственный метод 

public InputSource resolveEntity(String publicId,

String systemId) throws SAXException, IOException

интерфейса EntityResolver в пакете org.xml.sax позволяет предложению обрабатывать ссылки на внешние сущности. Интерфейс  EntityResolver  реализован в классе  DefaultHandler.  Метод resolveEntity(), реализованный  в этом классе, всегда возвращает null. В подклассе класса DefaultHandler можно переопределить  метод resolveEntity()для конкретного приложения.

Пример реализации метода resolveEntity() для разрешения внешних ссылок в документе email.xml:

public InputSource resolveEntity(String publicId,

String systemId) throws SAXException {

InputSource entitySource = null;

if (systemId.startsWith("file:"))

 systemId = systemId.substring(5);

try {

 entitySource =

new InputSource(new FileInputStream(systemId));

}

catch(IOException ioe)  {

 System.out.println("Ошибка в файле <" +

systemId + ">");

}

return entitySource;

}

С помощью методов

public abstract boolean isNamespaceAware()

public abstract boolean isValidating()

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

5.2.3.1.2. Класс DocumentBuilderFactory

Класс DocumentBuilderFactory пакета javax.xml.parsers определяет производственный (factory) интерфейс прикладного программирования для конфигурирования и получения DOM-анализатора.

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

public static DocumentBuilderFactory newInstance()

throws FactoryConfigurationError.

Создание нового экземпляра DOM-анализатора с использованием текущих производственных параметров выполняется с помощью метода

public abstract DocumentBuilder newDocumentBuilder()

throws ParserConfigurationException

В классе DocumentBuilderFactory определены также конкретные реализации получения и установки значений параметров конфигурации данного DOM-анализатора.

Так, методы

public boolean isNamespaceAware()

public void setNamespaceAware(boolean awareness)

проверяют возможность работы с пространствами имен или устанавливают возможность работы с пространствами имен (при значении awareness, равном true), а методы

public boolean isValidating()

public void setValidating(boolean validating).

проверяют возможность определения действительности документа XML или устанавливают проверку действительности документа XML (при значении validating, равном true)

По умолчанию значения awareness и validating установлены в false.

Методы 

public boolean isExpandEntityReferences()

public void

setExpandEntityReferences(boolean expandEntityRef)

проверяют возможность DOM-анализатора расширять узлы ссылок на сущности в документе XML или устанавливают возможность расширения узлов ссылок на сущности в документе XML (при значении expandEntityRef, равном true) По умолчанию значение expandEntityRef установлено в true.

Методы

public boolean isIgnoringComments()

public void setIgnoringComments(boolean ignoreComments)

проверяют, игнорирует ли DOM-анализатор комментарии в документе XML или устанавливают режим игнорирования комментариев в документе XML (при значении ignoreComments, равном true) По умолчанию значение ignoreComments установлено в false.

Методы

public boolean isIgnoringElementContentWhitespace()

public void

setIgnoringElementContentWhitespace(boolean whitespace)

проверяют, игнорирует ли DOM-анализатор лишние пробелы в содержимом элемента документа XML или устанавливают режим игнорирования лишних пробелов в содержимом элемента документа XML (при значении whitespace, равном true) По умолчанию значение whitespace установлено в false.

Методы

public boolean isCoalescing()

public void setCoalescing(boolean coalescing)

проверяют, сконфигурирован ли  DOM-анализатор для преобразования узлов типа CDATA в узлы типа Text и присоединяют их к соседнему узлу (если он существует) в документе XML или устанавливают режим такого преобразования  в документе XML (при значении coalescing, равном true) По умолчанию значение coalescing установлено в false.

Методы

public abstract Object getAttribute(String name)

throws IllegalArgumentException

public abstract void setAttribute(String name,

Object value) throws IllegalArgumentException

позволяют пользователю получать или устанавливать значение указанного атрибута в данной реализации.

Примеры открытия документа XML:

1. Открытие существующего файла email.xml (см. 5.1.1.5.2):

import org.w3c.dom.*;

import javax.xml.parsers.*;

Document emailDoc;

try {

  // Создание объекта DocumentBuilderFactory

 DocumentBuilderFactory emailFactory =

 DocumentBuilderFactory.newInstance();

  // Создание объекта DocumentBuilder

 DocumentBuilder emailBuilder =

emailFactory.newDocumentBuilder();

  // Анализ документа в файле email.xml

 emailDoc = emailBuilder.parse("email.xml");

  // Обработка документа emailDoc

 …

}

 // Обработка исключений

catch(Exception e) {

    System.out.println("Ошибка XML:" +

e.getMessage());

}

2. Создание дерева нового документа newEmail.xml с использованием метода newDocument():

import org.w3c.dom.*;

import javax.xml.parsers.*;

Document newEmailDoc;

try {

  // Создание объекта DocumentBuilderFactory

 DocumentBuilderFactory newEmailFactory =

 DocumentBuilderFactory.newInstance();

  // Создание объекта DocumentBuilder

 DocumentBuilder newEmailBuilder =

newEmailFactory.newDocumentBuilder();

  // Создание нового документа newEmailDoc

 newEmailDoc = newEmailBuilder.newDocument();

  // Формирование документа newEmailDoc

 

}

 // Обработка исключений

catch(Exception e) {

    System.out.println("Ошибка XML:" +

e.getMessage());

}

3. Создание дерева нового документа email1.xml с использованием метода getDOMImplementation():

import org.w3c.dom.*;

import javax.xml.parsers.*;

Document email1Doc;

try {

  // Создание объекта DocumentBuilderFactory

 DocumentBuilderFactory email1Factory =

 DocumentBuilderFactory.newInstance();

  // Создание объекта DocumentBuilder

 DocumentBuilder email1Builder =

email1Factory.newDocumentBuilder();

// Создание объекта DOMImplementation

DOMImplementation email1Impl =

email1Builder.getDOMImplementation();

  // Создание нового документа email1Doc

email1Doc = email1Impl.createDocument(

null,"email-folder", null);

  // Формирование документа emailDoc

 

}

 // Обработка исключений

catch(Exception e) {

    System.out.println("Ошибка XML:" +

e.getMessage());

}

5.2.3.2. Интерфейсы DOM XML в языке Java

Методы, реализующие операции над документом и его элементами, определены в интерфейсах пакета org.w3c.dom как в Java J2SE, так и в J2EE.

Интерфейсы пакета образуют иерархическую структуру, представленную на рис. 5.2.1.

 

Рис. 5.2.1. Иерархическая структура интерфейсов пакета org.w3c.dom для DOM XML

Рассмотрим компоненты пакета org.w3c.dom.

5.2.3.2.1. Интерфейс DOMImplementation

Интерфейс DOMImplementation обеспечивает методы, которые не зависят от конкретной реализации DOM.

Создание документа выполняется с помощью метода

public Document createDocument(String namespaceURI,

String qualifiedName, DocumentType doctype)

    throws DOMException

где namespaceURI – пространство имен URI,  а qualifiedName – полное имя для создаваемого документа. Параметр  задает тип создаваемого документа (может быть задано значение null).

Метод

public DocumentType

createDocumentType(String qualifiedName,

String publicId, String systemId) throws DOMException

создает пустой узел типа DocumentType с полным именем qualifiedName. Параметры publicId и systemId задают внешний общедоступный идентификатор и внешний системный идентификатор.

Метод

public boolean hasFeature(String feature, String version)

проверяет, реализован ли в данном программном продукте версии version компонент feature.  В качестве значения параметра feature задается наименование компонента, например,  "org.w3c.dom.svg" для SVG, а в качестве значения – версия DOM ("1.0" или "2.0").

Метод

Object getFeature(String feature, String version)

возвращает объект API, реализующий компонент feature для заданной  версии version.  

5.2.3.2.2. Интерфейс NodeList

Интерфейс NodeList задает абстрактное представление упорядоченной коллекции узлов. Метод

public int getLength()

возвращает длину коллекции, а метод

public Node item(int index)

возвращает элемент коллекции как узел типа Node (индексация элементов в коллекции начинается с 0).

5.2.3.2.3. Интерфейс NamedNodeMap

Интерфейс NamedNodeMap определяет коллекцию узлов – отображение (map), к элементам которой можно обращаться по имени (например, атрибуты узла).

Длину коллекции можно определить с помощью метода

public int getLength().

Получить узел либо по его имени name, либо по URI пространства имен namespaceURI и локальному имени localName можно с помощью методов

public Node getNamedItem(String name)

public Node getNamedItemNS(String namespaceURI,

String localName).

Узел можно также получить по его индексу index с помощью метода

public Node item(int index).

Добавить новый узел в конец списка узлов или заменить существующий узел можно с помощью одного из методов

public Node setNamedItem(Node arg)

                 throws DOMException

public Node setNamedItemNS(Node arg)

                   throws DOMException

Первый метод использует в качестве параметра arg имя узла (значение nodeName), второйзначения namespaceURI и localName для узла. Если заменяется существующий узел, возвращается замененный узел, иначе возвращается null.

И, наконец, удалить узел можно с помощью одного из методов

public Node removeNamedItem(String name)

throws DOMException

public Node removeNamedItemNS(String namespaceURI,

    String localName) throws DOMException.

Первый метод удаляет узел с заданным именем name, второйс заданным URI пространства имен namespaceURI и локальным именем localName.

5.2.3.2.4. Интерфейс Node

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

Поля интерфейса Node (с модификаторами public static final short) описывают тип узла:

  •  ATTRIBUTE_NODE (2)– узел  типа Attr, содержит атрибут элемента;
  •  CDATA_SECTION_NODE (4) – узел типа CDADASection;  
  •  COMMENT_NODE (8) – узел типа Comment;
  •  DOCUMENT_FRAGMENT_NODE (11) – узел типа DocumentFragment;
  •  DOCUMENT_NODE (9) – корневой узел типа Document;
  •  DOCUMENT_TYPE_NODE (10) – узел типа DocumentType;
  •  ELEMENT_NODE (1) – узел типа Element;
  •  ENTITY_NODE (6) – узел типа Entity;
  •  ENTITY_REFERENCE_NODE (5) –  узел   типа  EntityReference;   
  •  NOTATION_NODE (12) – узел типа Notation;
  •  PROCESSING_INSTRUCTION_NODE (7) – узел типа ProcessingInstruction;
  •  TEXT_NODE (3) – узел типа Text.

Методы интерфейса Node описывают действия с узлом дерева.

Проверить, поддерживается компонент для версии в узле можно с помощью метода

 public boolean isSupported(String feature, String version)

(этот метод действует аналогично методу hasFeature  в интерфейсе DOMImplementation).

Узнать тип узла, имя узла и  значение, хранящееся в узле можно с помощью методов

public short getNodeType()

public String getNodeName()

public String getNodeValue()

Установить новое значение для узла можно с помощью метода

public void setNodeValue(String nodeValue)

throws DOMException.

Методы

public String getLocalName()

public String getNamespaceURI()

позволяют получить локальное имя для узла и URI для пространства имен, а методы

public String getPrefix()

public void setPrefix(String prefix) throws DOMException

позволяют получить или установить префикс пространства имен для узла.

Проверить, есть ли атрибуты у элемента XML, можно с помощью метода

public boolean hasAttributes().

Атрибуты, заданные для узла, возвращает метод

public NamedNodeMap getAttributes().

Если у элемента нет атрибутов, этот метод  возвращает null.  

Метод

public boolean hasChildNodes()

проверяет, есть ли у данного узла узлы-потомки. Если они есть, то можно получить их список в виде объекта типа NodeList с помощью метода

public NodeList getChildNodes().

Первый и последний узлы в этом списке можно получить с помощью методов

public Node getFirstChild()

public Node getLastChild().

Родительский узел данного узла можно получить с помощью метода

public Node getParentNode(),

а соседние узлы с тем же родительским узлом,  что и данный узел, –  с помощью методов

public Node getPreviousSibling()

public Node getNextSibling().

Первый метод возвращает предыдущий узел, второй – следующий узел (если такого узла нет, возвращается null).

Ссылку на весь документ можно получить с помощью метода

public Document getOwnerDocument().

Большая группа методов интерфейса Node позволяет изменить дерево объектов. Добавить новый дочерний узел newChild как последний в списке узлов можно с помощью метода

public Node appendChild(Node newChild) throws DOMException.

Вставить новый дочерний узел newChild перед существующим дочерним узлом  refChild можно с помощью метода

public Node insertBefore(Node newChild, Node refChild)

throws DOMException,

Заменить дочерний узел oldChild новым узлом newChild можно с помощью метода 

public Node replaceChild(Node newChild,   Node oldChild)

throws DOMException,

а удалить дочерний узел child можно с помощью метода

public Node removeChild(Node child) throws DOMException.

Создать копию узла можно с помощью метода

public Node cloneNode(boolean deep).

Если параметр deep задан как true, то копируется также и поддерево для узла, иначе копируется только сам узел и его атрибуты (если они есть).

Метод

public void normalize()

преобразует узлы типа Text в поддереве данного узла в нормальную форму, т.е. в такую форму, в которой нет смежных текстовых узлов (эти узлы сливаются в один узел) или пустых текстовых узлов (такие узлы удаляются).

5.2.3.2.5. Интерфейсы Document, DocumentFragment и DocumentType

Интерфейс Document помимо методов интерфейса Node, содержит  методы работы с документом в целом.

Следует иметь в виду, что в отличие от модели DOM для JavaScript, документ не содержит дочернего узла с именем xml (этот узел типа PROCESSING_INSTRUCTION_NODE содержит дескриптор <?xml …?>).    

Метод

public DocumentType getDocType()

возвращает объект типа DocumentType (DTD документа).

Метод

public DOMImplementation getImplementation()

возвращает объект DOMImplementation, который обрабатывает данный документ (приложение DOM может использовать объекты из разных реализаций).

Метод

public Element getDocumentElement()

возвращает корневой элемент дерева объектов, а методы

public NodeList getElementsByTagName(String)

public NodeList getElementsByTagNameNS(String namespaceURI,

    String localName)

возвращают все элементы либо с указанным именем tagname, либо с заданным URI пространства имен namespaceURI и локальным именем localName.

Примеры использования методов поиска и изменения в интерфейсе Document:

1. Получение имени и типа корневого элемента email.xml:

// Получение корневого элемента emailDoc

Node rootElement = emailDoc.getDocumentElement();

// Получение имени корневого элемента emailDoc

String rootElementName = rootElement.getNodeName();

  // Получение типа корневого элемента emailDoc

short rootElementType = rootElement.getNodeType();

  // Вывод имени и типа корневого элемента emailDoc

System.out.println("Корневой элемент 'email.xml': " +

rootElementName + "  Тип: " + rootElementType);

Вывод этого фрагмента программы будет иметь следующий вид:

Корневой элемент 'email.xml': email-folder  Тип: 1

2. Вывод списка тем сообщений в  email.xml:

// Получение списка элементов subject

NodeList subjectList =

emailDoc.getElementsByTagName("subject");

    // Получение количества элементов subject

int subjectNumber =  subjectList.getLength();

System.out.println("Количество сообщений: " +

subjectNumber);

   // Получение тем сообщений в цикле

for (int i=0; i < subjectNumber;i++) {

     // Получение текущей темы

 String subjectValue =

   subjectList.item(i).getFirstChild().getNodeValue();

       // Вывод текущей темы

    System.out.println("Тема " + (i+1) + ": '" +

subjectValue + "'");

}

Вывод этого фрагмента программы будет иметь следующий вид:

Количество сообщений: 5

Тема 1: 'Поздравление'

Тема 2: 'Напоминание'

Тема 3: 'Отказ'

Тема 4: 'Вопрос'

Тема 5: 'Ответ'

3. Изменение значения темы в первом сообщении:

// Новое значение темы

String newSubject = "Новогоднее поздравление";

           // Изменение содержимого первой темы

subjectList.item(0).getFirstChild().setNodeValue(

newSubject);

   // Получение нового значения темы

String newSubjectValue =

subjectList.item(0).getFirstChild().getNodeValue();

       // Вывод нового значения темы

System.out.println("Новая тема 1: '" +

newSubjectValue + "'"); 

Вывод этого фрагмента программы будет иметь следующий вид:

Новая тема 1: 'Новогоднее поздравление'

Метод

public Element getElementById(String elementId)

возвращает элемент, значение атрибута с именем id которого равно elementId.

Несколько методов позволяют изменить структуру и содержимое дерева объектов.

Создание нового пустого элемента или атрибута выполняется с помощью методов

public Element createElement(String tagName)

throws DOMException

public Element createElementNS(String namespaceURI,

    String localName) throws DOMException

public Attr createAttribute(String name)

throws DOMException

public Attr createAttributeNS(String namespaceURI,

    String qualifiedName) throws DOMException

создают узел или атрибут либо по имени (tagName или name), либо по заданному URI пространства имен namespaceURI и локальному имени localName.

Методы

public CDATASection createCDATASection(String data)

throws DOMException

public EntityReference createEntityReference(String name)

throws DOMException

public ProcessingInstruction

createProcessingInstruction(String target,

String data) throws DOMException

public Text createTextNode(String data)

throws DOMException

public Comment createComment(String data)

throws DOMException

создают узлы типа CDATASection, EntityReference, ProcessingInstruction, Text и Comment.

Примеры использования методов создания и добавления элементов в интерфейсе Document:

1. Создание структуры документа для  newEmail.xml:

// Создание корневого элемента newEmailDoc

Element newEmailRootElement =

newEmailDoc.createElement("new-email-folder");

           // Добавление корневого элемента

// в документ newEmailDoc

newEmailDoc.appendChild(newEmailRootElement);

    // Создание элемента message1

Element message1Element =

newEmailDoc.createElement("message");

           // Добавление к корневому элементу дочернего

   // элемента message1

newEmailRootElement.appendChild(message1Element);

           // Создание комментария

Comment msgComment =

newEmailDoc.createComment("Сообщение 1");

           // Создание элемента header

Element headerElement =

newEmailDoc.createElement("header");

           // Создание элемента body

Element bodyElement =

newEmailDoc.createElement("body");

     // Создание текстового узла для элемента body

Text bodyText =

newEmailDoc.createTextNode("Завтра зачет по физике.");

           // Добавление текстового узла для элемента body

bodyElement.appendChild(bodyText);

           // Добавление комментария к элементу message1 

message1Element.appendChild(msgComment);

           // Добавление к элементу message1

// дочернего элемента header

message1Element.appendChild(headerElement);

           // Добавление к элементу message1

// дочернего элемента body

message1Element.appendChild(bodyElement);

           // Клонирование элемента message1

Node message2Element = message1Element.cloneNode(true);

           // Добавление к корневому элементу дочернего

    // элемента message2

newEmailRootElement.appendChild(message2Element);

           // Получение списка элементов message

NodeList messageList =

newEmailDoc.getElementsByTagName("message");

           // Изменение комментария в элементе message2

messageList.item(1).getFirstChild().setNodeValue(

"Сообщение 2");

           // Получение списка элементов body

NodeList bodyList =

newEmailDoc.getElementsByTagName("body");

           // Изменение текста сообщения в элементе message2

bodyList.item(1).getFirstChild().setNodeValue(

"Спасибо, что напомнил");

Полученный в результате выполнения этого фрагмента программы документ XML будет иметь следующий вид:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<new-email-folder>

<message>

<!--Сообщение 1-->

<header/>

<body>Завтра зачет по физике.</body>

</message>

<message>

<!--Сообщение 2-->

<header/>

<body>Спасибо, что напомнил</body>

</message>

</new-email-folder>

Метод

public Node importNode(Node importedNode, boolean deep)

throws DOMException

импортирует (копирует) узел из другого документа в данный документ. Возвращаемый узел не имеет родительского узла. Если для параметра задано значение true, то копируется также поддерево данного узла.

Пример использования метода importNode():

В новый документ email1Doc импортируются второе и третье сообщение документа  email1Doc (email.xml):

// Получение корневого элемента emailDoc

Node root1Element = email1Doc.getDocumentElement();

   // Получение списка элементов message в emailDoc

NodeList sourceMessageList =

emailDoc.getElementsByTagName("message");

           // Импорт второго сообщения из email.doc в email1.doc

Node resultMessage2 =

email1Doc.importNode(sourceMessageList.item(1), true);

           // Добавление второго сообщения в email1.doc

root1Element.appendChild(resultMessage2);

    // Импорт третьего сообщения из email.doc в email1.doc

Node resultMessage3 =

email1Doc.importNode(sourceMessageList.item(2), true);

           // Добавление третьего сообщения в email1.doc

root1Element.appendChild(resultMessage3);

Полученный в результате выполнения этого фрагмента программы документ XML будет иметь следующий вид:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<email-folder>

<message>

         <!-- Сообщение 2 -->

         <header>

             <address>

          <from value="ivanov@mail.com"/>

               <to value="sidorov@mail.com"/>

            </address>

            <subject>Напоминание</subject>

        </header>

       <body>Встречаемся в 10.00.</body>

    </message>

<message>

        <!-- Сообщение 3 -->

         <header>

           <address>

               <from value="sidorov@mail.com"/>

                 <to value="ivanov@mail.com"/>

              </address>

              <subject>Отказ</subject>

         </header>

       <body>Я не смогу в это время.</body>

  </message>

</email-folder>

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

Создать узел типа  DocumentFragment – фрагмент данного документа можно с помощью метода

public DocumentFragment createDocumentFragment()

интерфейса Document.

Интерфейс DocumentType обеспечивает доступ к DTD документа XML. Помимо свойств и методов, унаследованных от интерфейса Node, для DocumentType определены следующие методы.

Метод

public String getName()

позволяет получить имя DTD, т.е. идентификатор, следующий сразу за ключевым словом DOCTYPE, а метод

public String getInternalSubset()

позволяет получить содержимое внутреннего DTD как строку.

Методы

public String getPublicId()

public String getSystemId()

позволяют получить общедоступный или системный идентификатор для внешнего DTD.

Методы

public NamedNodeMap getEntities()

public NamedNodeMap getNotations()

позволяют получить определенные в DTD сущности и нотации как узлы типа NamedNodeMap.

5.2.3.2.6. Интерфейс Element

Интерфейс Element добавляет к методам своего родительского элемента Node методы работы с атрибутами элемента XML и методы, позволяющие обратиться к вложенным элементам.

Метод

public String getTagName()

возвращает имя элемента.

Методы

public NodeList getElementsByTagName(String name)

public NodeList getElementsByTagNameNS(String namespaceURI,

String localName)

позволяют получить коллекцию дочерних узлов данного элемента либо с заданным именем name,  либо с заданным URI пространства имен namespaceURI и локальным именем localName.

Проверить наличие у элемента атрибута с именем name, либо по заданному URI пространства имен namespaceURI и локальному имени localName можно с помощью методов

public boolean hasAttribute(String)

public boolean hasAttributeNS(String namespaceURI,

String localName).

Получить атрибут в виде объекта типа Attr или его значение в виде строки по имени name, либо по заданному URI пространства имен namespaceURI и локальному имени localName можно с помощью методов

public Attr getAttributeNode(String name);

public Attr getAttributeNodeNS(String namespaceURI,

String localName)

public String getAttribute(String name);

public String getAttributeNS(String namespaceURI,

String localName).

Установить значение атрибута value можно с помощью методов

public void setAttribute(String name, String value)

throws DOMException

public void setAttributeNS(String namespaceURI,

String qualifiedName, String value)

throws DOMException.

Создание нового атрибута как узла типа Attr или изменение существующего узла типа Attr выполняется с помощью методов

public Attr setAttributeNode(Attr newAttr)

throws DOMException

public Attr setAttributeNodeNS(Attr newAttr)

throws DOMException

Первый метод добавляет или замещает узел по его имени, второй – по URI пространства имен и локальному имени.

Удалить атрибут с именем name, либо с заданным URI пространства имен namespaceURI и локальным именем localName можно с помощью методов

public void removeAttribute(String name)

throws DOMException

public void removeAttributeNS(String namespaceURI,

    String localName) throws DOMException.

Удаление атрибута как узла типа Attr с именем name выполняется с помощью метода

public Attr removeAttributeNode(Attr name)

throws DOMException.

Примеры использования методов интерфейса Element:

1. Вывести отправителей и тему для сообщений электронной почты, получателем которой является ivanov@mail.com:

// Получение списка элементов to в emailDoc

NodeList toMessageList =

emailDoc.getElementsByTagName("to");

           // Получение количества элементов to 

int toNumber =  toMessageList.getLength();

    // Получение списка элементов from в emailDoc

NodeList fromMessageList =

emailDoc.getElementsByTagName("from");

           // Получение списка элементов subject в emailDoc

NodeList subjectToList =

emailDoc.getElementsByTagName("subject");

  // Вывод заголовка

System.out.println("Вывод почты для ivanov@mail.com");

           // Получение адресатов в цикле

for (int i=0; i < toNumber;i++) {

    // Получение текущего элемента to

Element currentTo = (Element)toMessageList.item(i);

         // Получение значения атрибута value

         // в текущем элементе to

String currentToValue =

currentTo.getAttribute("value");

                // Если получателем является ivanov@mail.com

if(currentToValue.equals("ivanov@mail.com")) {

                     // Получение текущего элемента from

       Element currentFrom =

   (Element)fromMessageList.item(i);

                     // Получение значения атрибута value

           // в текущем элементе from

    String currentFromValue =

 currentFrom.getAttribute("value");

                     // Получение текущей темы

          String currentSubjectValue =

subjectList.item(i).getFirstChild().getNodeValue(); 

                     // Вывод сведений о сообщении

        System.out.println("  Сообщение " + (i+1) + ":\n" +

    "      Отправитель: " + currentFromValue + "\n" +

   "             Тема: " + currentSubjectValue);

}

}

Вывод этого фрагмента программы будет иметь следующий вид:

Вывод почты для ivanov@mail.com

               Сообщение 3:

Отправитель: sidorov@mail.com

               Тема: Отказ

 Сообщение 5:

    Отправитель: sidorov@mail.com

                Тема: Ответ

2. Добавить в документе newEmailDoc в элементы message атрибут id, а в элементы header – атрибуты from, to и subject:

// Получение списка элементов message в newEmailDoc

NodeList newMessageList =

newEmailDoc.getElementsByTagName("message");

           // Установка атрибута id для элементов message в цикле

for (int i=0; i < newMessageList.getLength();i++) {

                // Получение текущего элемента message

   Element currentMsg = (Element)newMessageList.item(i);

                // Создание узла аттрибута id

           Attr idAttr = newEmailDoc.createAttribute("id");

                // Задание значения для узла атрибута id

           idAttr.setValue("msg" + (i+1));

                // Установка атрибута id для

       // текущего элемента message

           currentMsg.setAttributeNode(idAttr);

}

           

// Массив отправителей писем

String [] fromArray =

{"petrov@mail.com","sidorov@mail.com"};

           // Массив получателей писем

String [] toArray =

{"sidorov@mail.com","petrov@mail.com"};

           // Массив тем писем

String [] subjectArray =

{"Напоминание","Благодарность"};

           // Получение списка элементов header в newEmailDoc

NodeList newHeaderList =

newEmailDoc.getElementsByTagName("header");

           // Установка атрибутов для элементов header в цикле

for (int i=0; i < newMessageList.getLength();i++) {

                // Получение текущего элемента header

           Element currentHeader =

   (Element)newHeaderList.item(i);

         // Установка значения атрибута from

        // для текущего элемента header

           currentHeader.setAttribute("from", fromArray[i]);

                // Установка значения атрибута to

        // для текущего элемента header

           currentHeader.setAttribute("to", toArray[i]);

                // Установка значения атрибута subject

        // для текущего элемента header

    currentHeader.setAttribute("subject",

subjectArray[i]);

}

Полученный в результате выполнения этого фрагмента программы документ XML примет следующий вид:

<?xml version="1.1" encoding="UTF-8" standalone="no"?>

<new-email-folder>

<message id="msg1">

<!--Сообщение 1-->

<header from="petrov@mail.com"

subject="Напоминание" to="sidorov@mail.com"/>

<body>Завтра зачет по физике.</body>

</message>

<message id="msg2">

<!--Сообщение 2-->

<header from="sidorov@mail.com"

subject="Благодарность" to="petrov@mail.com"/>

<body>Спасибо, что напомнил</body>

</message>

</new-email-folder>

5.2.3.2.7. Интерфейс Attr

Интерфейс Attr представляет атрибут элемента типа Element.

Помимо свойств и методов, унаследованных от интерфейса Node, в интерфейсе определены следующие методы.

Методы

public String getName()

public String getValue()

позволяют получить имя и значение атрибута. Значение атрибута можно изменить с помощью метода

public void setValue(String value) throws DOMException.

Получить элемент типа Element, для которого определен данный атрибут можно с помощью метода

public Element getOwnerElement().

Если узел типа Attr не связан ни с одним элементом, возвращается null.

Метод

public boolean getSpecified()

возвращает true, если атрибуту присвоено значение в документе  и false – в противном случае.

5.2.3.2.8. Интерфейсы CharacterData, Text, Comment и CDATASection

Интерфейс CharacterData расширяет интерфейс Node набором методов для доступа к символьным данным.

Метод

public int getLength()

позволяет получить длину символьных данных в 16-битовых единицах.

Получить символьные данные можно с помощью одного из методов

public String getData() throws DOMException

public String substringData(int offset, int count)

throws DOMException.

Первый метод возвращает все символьные данные, а второй – подстроку символьных данных, начиная с позиции offset длиной count.

Задать новые значения символьных данных можно с помощью метода

public void setData(String data) throws DOMException.

Метод

public void appendData(String arg) throws DOMException

добавляет строку arg в конец символьных данных, метод

public void insertData(int offset, String arg)

throws DOMException

добавляет строку arg в символьные данные, начиная с позиции offset, а метод

public void replaceData(int offset, int count, String arg)

throws DOMException

замещает в символьных данных подстроку, начиная с позиции offset и длиной    count строкой arg.

Метод

public void deleteData(int offset, int count)

throws DOMException

удаляет из символьных данных подстроку длиной count, начиная с позиции offset.

Интерфейс Text является наследником интерфейса CharacterData и представляет текстуальное содержимое элемента или атрибута (узла типа Element или Attr). Своих свойств и методов интерфейс не имеет, а наследует все свойства и методы  интерфейса CharacterData.

Интерфейс Comment также является  наследником интерфейса CharacterData и представляет текстуальное содержимое комментария. Этот интерфейс также не имеет своих свойств и методов.

Интерфейс CDATASection является наследником интерфейса Text и представляет текстуальное содержимое секций CDATA документа XML. Этот интерфейс также не имеет своих свойств и методов.

5.2.3.2.9. Интерфейсы Entity, EntityReference, Notation и ProcessingInstruction

Интерфейс Entity определяет анализируемую или неанализируемую сущность в документе XML. Для него определены только свойства и методы, унаследованные от интерфейса Node.

Интерфейс EntityReference определяет ссылки на анализируемые  или неанализируемую сущности в документе XML. Для него также определены только свойства и методы, унаследованные от интерфейса Node.

Интерфейс Notation определяет нотации в документе XML. Помимо свойств и методов, унаследованных от интерфейса Node, для него определены методы

public String getPublicId()

public String getSystemId(),

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

Интерфейс ProcessingInstruction определяет инструкции по обработке для процессора XML в документе XML. Помимо свойств и методов, унаследованных от интерфейса Node, для него определен метод получения имени инструкции по обработке

public String getTarget(),

а также методы

public String getData()

public void setData(String data) throws DOMException,

позволяющие получить или установить данные для инструкции по обработке.

5.2.3.2.10. Исключение DOMException

Многие методы пакета org.w3c.dom бросают исключение DOMException.

Объект класса DOMException создается с помощью конструктора

public DOMException(short code, String message)

в котором задается числовой код code ошибки и сообщение message, выводимое при ошибке.

Код ошибки содержится в поле

public short code

класса DOMException. Другие поля этого класса (с модификаторами public static final short) содержат целые переменные, позволяющие определить причину возникновения ошибки:

  •  DOMSTRING_SIZE_ERR – если заданная строка не помещается в другую строку;
  •  HIERARCHY_REQUEST_ERR – если узел вставляется туда, где он не может находиться;
  •  INDEX_SIZE_ERR – если индекс или размер являются отрицательными числами, либо превышают допустимое значение;
  •  INUSE_ATTRIBUTE_ERR – попытка добавления атрибута, используемого в другом месте;
  •  INVALID_ACCESS_ERR – если параметр и операция не поддерживаются объектом;
  •  INVALID_CHARACTER_ERR – если используется неверный или недопустимый символ (например, в имени);
  •  INVALID_MODIFICATION_ERR – если предпринята попытка изменить тип объекта;
  •  INVALID_STATE_ERR – если  предпринята попытка использовать объект, который нельзя использовать;
  •  NAMESPACE_ERR – если  предпринята попытка создать или изменить объект без учета пространства имен;
  •  NO_DATA_ALLOWED_ERR – если данные определены для узла, который их не поддерживает;
  •  NO_MODIFICATION_ALLOWED_ERR – если  предпринята попытка модифицировать объект, который нельзя модифицировать;
  •  NOT_FOUND_ERR – если предпринята попытка ссылки на узел в контексте, в котором данный узел не существует;
  •  NOT_SUPPORTED_ERR – если реализация не поддерживает запрашиваемый тип объекта или операцию;
  •  SYNTAX_ERR – если определена неверная или незаконная строка;
  •  WRONG_DOCUMENT_ERR – если узел используется не в том документе, в котором он был создан.

5.2.3.3. Средства выполнения преобразований документов XML в языке Java  

Общие средства выполнения преобразований документов XML определены в пакете javax.xml.transform. Реализация этих средств для DOM-анализаторов и SAX-анализаторов описаны в пакетах javax.xml.transform.dom и javax.xml.transform.sax. Средства преобразования для потоков ввода-вывода и URI описаны в пакете javax.xml.transform.stream.

5.2.3.3.1. Общие средства выполнения преобразований документов XML

Основными интерфейсами пакета являются интерфейсы Source и Result. Объекты, реализующие интерфейс Source, содержат информацию, необходимую для того, чтобы выступать в качестве источника ввода, а объекты,    реализующие интерфейс Result, содержат информацию, необходимую для построения результирующего дерева преобразования.

Интерфейсы содержат по два одинаковых метода

public String getSystemId()

public void setSystemId(String systemId),

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

Кроме того, интерфейс содержит два строковых поля с модификаторами public static final: поле PI_DISABLE_OUTPUT_ESCAPING, определяющее имя инструкции по обработке, посылаемую, если в результирующем дереве отключено удаление символов (обычно при сериализации отключается вывод символов "&", "<" в выходное дерево) и поле PI_ENABLE_OUTPUT_ESCAPING, определяющее имя инструкции по обработке, посылаемую, если в результирующем дереве включено удаление символов.

Интерфейс SourceLocator содержит методы, определяющие местоположение ошибки в источнике XML или инструкции преобразования.

Метолы этого интерфейса

public int getLineNumber()

public int getColumnNumber()

public String getPublicId()

public String getSystemId()

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

Объект, реализующий интерфейс Templates является представлением времени выполнения для обрабатываемой инструкции преобразования.

Метод

public Properties getOutputProperties()

позволяет получить статические свойства для xsl:output, а метод

public Transformer newTransformer()

throws TransformerConfigurationException

создает новый контекст преобразования для данного объекта Transformer.

Объект, реализующий интерфейс URIResolver для преобразования URI, используемого в документе – xsl:import  или xsl:include в объект Source. Единственный метод этого интерфейса

public Source resolve(String href, String base)

              throws TransformerException

вызывается процессором XML, когда он встречает элементы xsl:include, xsl:import или функцию.

Интерфейс ErrorListener определяет три метода для получения уведомления о серьезной ошибке, восстановимой ошибке и предупреждении при выполнении операций преобразования:

public void fatalError(TransformerException exception)

throws TransformerException

public void error(TransformerException exception)

throws TransformerException

public void warning(TransformerException exception)

throws TransformerException

Абстрактный класс Transformer определяет объекты, которые могут использоваться для преобразования из исходного дерева в результирующее дерево.

Основной метод этого класса

public abstract void transform(Source xmlSource,

Result outputTarget) throws TransformerException

выполняет преобразование исходного дерева xmlSource в результирующее дерево outputTarget.

Остальные методы позволяют получить или установить отдельные свойства преобразования.

Так, методы 

public abstract Object getParameter(String name)

public abstract void setParameter(String name,

Object value)

public abstract void clearParameters()

позволяют соответственно получить, установить или очистить параметры преобразования.

Методы

public abstract Properties getOutputProperties()

public abstract void

setOutputProperties(Properties oformat)

    throws IllegalArgumentException

позволяют получить или установить выходные свойства как объекты класса Properties, а методы

public abstract String getOutputProperty(String name)

throws IllegalArgumentException

public abstract void setOutputProperty(String name,

    String value) throws IllegalArgumentException

позволяют получить или установить одно выходное свойство как строковый объект.

Методы

public abstract URIResolver getURIResolver()

public abstract void setURIResolver(URIResolver resolver)

позволяют получить или установить объект, который будет использоваться для разрешения URI, используемых в документе.

И, наконец, методы

public abstract ErrorListener getErrorListener()

public abstract void

setErrorListener(ErrorListener listener)

throws IllegalArgumentException

позволяют получить или установить блок прослушивания событий ошибок для данного преобразования.

Абстрактный класс TransformerFactory позволяет создать объекты класса Transformer и интерфейса Templates.

Объект этого класса создается с помощью производственного метода

public static TransformerFactory newInstance()

throws TransformerFactoryConfigurationError,

Объект класса Transformer создается с помощью одного из методов:

public abstract Transformer newTransformer()

throws TransformerConfigurationException

public abstract Transformer newTransformer(Source source)

throws TransformerConfigurationException. 

Первый метод создает объект Transformer, который преобразует копию источника в результат, а второй метод преобразует объект интерфейса Source в объект Transformer.

Объект интерфейса Templates создается с помощью метода 

public abstract Templates newTemplates(Source source)

throws TransformerConfigurationException.

Метод 

public abstract Source

getAssociatedStylesheet(Source source,

String media, String title, String charset)

    throws TransformerConfigurationException

позволяет получить связанную с источником таблицу стилей (определенную в документе XML с помощью инструкции по обработке xml-stylesheet).

Метод

public abstract boolean getFeature(String name)

позволяет получить заданное свойство, задаваемое в форме абсолютного URI).

Методы

public abstract Object getAttribute(String name)

throws IllegalArgumentException

public abstract void setAttribute(String name,

Object value) throws IllegalArgumentException

позволяют пользователю получать или устанавливать значение указанного атрибута в данной реализации.

Остальные методы класса: getErrorListener(),setErrorListener(),  getURIResolver() и setURIResolver()дублируют соответствующие методы класса Transformer.

Класс OutputKeys обеспечивает строковые константы, которые используются либо для установки выходных свойств класса Transformer, либо для получения выходных свойств объектов Transformer или Templates.   

Имена свойств задаются следующими строковыми константами класса OutputKeys с модификаторами public static final:

  •  CDATA_SECTION_ELEMENTSсписок  имен секций CDATA;
  •  DOCTYPE_PUBLIC –  общедоступный  идентификатор преобразованного документа;
  •  DOCTYPE_SYSTEM –  системный   идентификатор   преобразованного  документа;
  •  ENCODING – кодировка символов преобразованного документа;
  •  INDENT – делать ли отступы: "yes" или "no";
  •  MEDIA_TYPE – MIME-тип содержимого преобразованного документа;
  •  METHOD – одно из значений "xml", "html" или "text"',
  •  OMIT_XML_DECLARATION – не включать объявление XML:  "yes" или "no";
  •  STANDALONE — отдельный или вложенный документ: "yes" или "no";
  •  VERSION – номер версии.

Например, можно задать кодировку символов преобразованного документа следующим методом:

transformer.setOutputProperty(

OutputKeys.ENCODING, "Windows-1251"

);

Правда, в этом случае все символы кириллицы будут представлены как сущности – десятичные коды символов Unicode. По умолчанию используется кодировка "UTF-8".

Класс TransformerException определяет исключительную ситуацию, которая может случиться во время выполнения операции преобразования.

Основным конструктором этого класса является конструктор

public TransformerException(String message,

SourceLocator locator, Throwable e)

который создает объект-исключение с заданным текстом сообщения message, объектом locator интерфейса SourceLocator и являющийся оболочкой для исключения e. В остальных конструкторах задаются один или два из приведенных параметров.

Методы 

public Throwable getCause()

public Throwable getException()

public String getLocationAsString()

public SourceLocator getLocator()

public String getMessageAndLocation()

позволяют получить причину появления исключения; класс исключения, для которого данное исключение служит оболочкой, получить информацию о местоположении исключения как строку или объект интерфейса SourceLocator, и, наконец, получить и текст сообщения, и местоположение ошибки.

Метод

public Throwable initCause(Throwable cause)

инициализирует причину данного исключения и приводит его к другому исключению, а метод

public void setLocator(SourceLocator location)

устанавливает объект интерфейса SourceLocator.

Методы 

public void printStackTrace()

public void printStackTrace(PrintStream s)

public void printStackTrace(PrintWriter s)

переопределяют соответствующие методы класса Throwable и выводят трассировку ошибки на дисплей, в байтовый или символьный поток.

Класс TransformerConfigurationException, расширяющий класс TransformerException, указывает на серьезную ошибку конфигурации. Так же, как и в классе TransformerException, основным конструктором является конструктор

public TransformerConfigurationException(String message,

SourceLocator locator, Throwable e),

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

Своих методов класс TransformerConfigurationException не имеет.

5.2.3.3.2. Средства преобразования для DOM-анализатора

Средства преобразования для DOM-анализатора реализованы в пакете javax.xml.transform.dom.

Интерфейс DOMLocator расширяет интерфейс SourceLocator и содержит единственный метод

public Node getOriginatingNode(),

возвращающий узел, в котором произошло событие.

Класс DOMSource действует как хранилище для преобразования дерева объекта Source, представленного в форме дерева DOM.

Конструкторы класса

public DOMSource()

public DOMSource(Node n)

public DOMSource(Node node, String systemID)

Первый и второй конструкторы создают соответственно пустой объект и объект для заданного узла n (новый источник ввода создается для поддерева этого узла). Третий конструктор задает дополнительно системный идентификатор в форме базового URI.

В классе DOMSource задано поле

public static final String FEATURE.

Если метод getFeature() класса TransformerFactory возвращает true для значения FEATURE, указанного в качестве аргумента метода, то объект Transformer поддерживает источник ввода данного типа.

Методы

public Node getNode()

public void setNode(Node node)

позволяют получить или установить исходное дерево DOM, а с помощью методов

public String getSystemId()

public void setSystemId(String baseID)

можно получить или установить системный идентификатор в форме базового URI.

Класс DOMResult действует как хранилище для преобразования результирующего дерева в форме дерева DOM.

Конструкторы класса

public DOMResult()

public DOMResult(Node n)

public DOMResult(Node node, String systemID)

Первый и второй конструкторы создают соответственно пустой объект и вывода для заданного узла n (это должен быть либо узел типа Document, либо узел DocumentFragment, либо узел типа  Element, т.е. узел, который может иметь дочерние узлы). Третий конструктор задает дополнительно системный идентификатор в форме базового URI.

В классе DOMResult задано поле

public static final String FEATURE.

Если метод getFeature() класса TransformerFactory возвращает true для значения FEATURE, указанного в качестве аргумента метода, то объект Transformer поддерживает адресат вывода данного типа.

Методы 

public Node getNode()

public void setNode(Node node)

позволяют получить или установить выходное дерево DOM (узел node должен иметь один из типов, перечисленных выше).  Методы getSystemId() и setSystemId() действуют аналогично соответствующим методам класса DOMSource.

5.2.3.3.3. Средства преобразования для потоков ввода-вывода

Средства преобразования для потоков ввода-вывода определены в классах StreamSource и StreamResult пакета javax.xml.transform.stream.

Класс StreamSource действует как хранилище для источника преобразования в виде потока разметки XML.

Конструкторы класса

public StreamSource()

public StreamSource(File f)

public StreamSource(InputStream inputStream)

public StreamSource(InputStream inputStream,

String systemId)

public StreamSource(Reader reader)

public StreamSource(Reader reader, String systemId)

public StreamSource(String systemId)

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

В классе StreamSource задано поле

public static final String FEATURE.

Если метод getFeature() класса TransformerFactory возвращает true для значения FEATURE, указанного в качестве аргумента метода, то объект Transformer, поддерживает входной источник данного типа.

Методы класса позволяют получить или установить источники входного потока.

Так, методы

public InputStream getInputStream()

public void setInputStream(InputStream inputStream)

получают и устанавливают байтовый входной поток для источника, а методы

public Reader getReader()

public void setReader(Reader reader)

выполняют те же операции для символьного потока.

Методы

public String getPublicId()

public void setPublicId(String publicId)  

получают и устанавливают общедоступный идентификатор для источника, а методы

public String getSystemId()

public void setSystemId(String systemId)

выполняют те же операции для системного идентификатора.

Метод

public void setSystemId(File f)

позволяет получить системный идентификатор из ссылки на файл

Класс StreamResult действует как хранилище для результата преобразования, который может быть  документом XML или HTML, либо текстовым документом.

Конструкторы класса

public StreamResult()

public StreamResult(File f)

public StreamResult(OutputStream outputStream)

public StreamResult(String systemId)

public StreamResult(Writer writer)

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

В классе StreamResult задано поле

public static final String FEATURE.

Если метод getFeature() класса TransformerFactory возвращает true для значения FEATURE, указанного в качестве аргумента метода, то объект Transformer, поддерживает выходной адресат данного типа.

Методы класса позволяют получить или установить адресаты выходного потока.

Так, методы

public OutputStream getOutputStream()

public void setOutputStream(OutputStream outputStream)

получают и устанавливают байтовый выходной поток для адресата, а методы

public Writer getWriter()

public void set Writer(Writer writer)

выполняют те же операции для символьного выходного потока.

Методы 

public String getSystemId()

public void setSystemId(String systemId)

получают и устанавливают общедоступный идентификатор для адресата, а метод

public void setSystemId(File f)

позволяет получить системный идентификатор из ссылки на файл.

Примеры вывода документов XML:

1. Вывод документа newEmailDoc в файл newemail.xml:

// Создание объекта TransformerFactory

TransformerFactory transXMLFactory =

TransformerFactory.newInstance() ;

// Создание объекта Transformer

Transformer XMLTransformer =

transXMLFactory.newTransformer();

// Создание объекта DOMSource

DOMSource sourceXML = new DOMSource(newEmailDoc);

// Создание объекта File

File newXMLFile = new File("newemail.xml"); 

// Создание объекта FileOutputStream

FileOutputStream newEmailOutput =

new FileOutputStream(newXMLFile);

// Создание объекта StreamResult

StreamResult resultXML = new StreamResult(newEmailOutput);

// Выполнение преобразования из DOMSource в

// StreamResult и вывод результата в файл newemail.xml

XMLTransformer.transform(sourceXML, resultXML);

2. Вывод содержимого документа email1Doc на экран:

// Создание объекта TransformerFactory

TransformerFactory transStringFactory =

TransformerFactory.newInstance() ;

// Создание объекта Transformer

Transformer stringTransformer =

transStringFactory.newTransformer();

// Создание объекта DOMSource

DOMSource sourceStringXML = new DOMSource(email1Doc);

// Создание объекта StringWriter

StringWriter outputXMLString = new StringWriter();

// Создание объекта StreamResult

StreamResult resultStringXML =

new StreamResult(outputXMLString);

// Выполнение преобразования из DOMSource в

// StreamResult и вывод результата в outputXMLString

stringTransformer.transform(sourceStringXML,

resultStringXML);

   // Преобразование результата в строку

String newEmailString = outputXMLString.toString();

   // Вывод документа на экран

System.out.println("Новый документ XML:\n " +

newEmailString);

Файл: file:///web/1/5fan/public_html/www/files/13/5fan_ru_69059_26b926b561fbfaa0ee84dc28cebc4393.doc   Создан: 2008-03-07T06:23:00Z Модифицирован: 2008-03-07T06:23:00Z     Автор:


 

А также другие работы, которые могут Вас заинтересовать

84255. Строение, размеры, формы, химический состав вирусов и фагов. Классификация вирусов 37.28 KB
  Классификация вирусов формы химический состав вирусов и фагов. Классификация вирусов Вирусная частица вирион состоит из спирально закрученной нуклеиновой кислоты – ДНК или РНК покрытой снаружи белковой оболочкой капсидом. Содержание нуклеиновой кислоты и белка у разных вирусов неодинаковое.
84256. Репродукция вирусов. Развитие вирулентного и умеренного фагов. Понятие о лизогенной культуре 78.28 KB
  На этой стадии происходит прикрепление вируса к поверхности клетки. Внутрь клетки проникает лишь нуклеиновая кислота. Инъецированная нуклеиновая кислота фага прежде всего вызывает полную перестройку метаболизма зараженной клетки. Выход фагов из клетки.
84258. Способы питания микроорганизмов 33.22 KB
  Пищей обычно называют вещества которые попав в живой организм служат либо источником энергии необходимой для процессов жизнедеятельности либо материалом для построения составных частей клетки. Голофитный способ – живые существа используют питательные вещества всасывая их в виде относительно небольших молекул из водного раствора. Чтобы проникнуть в клетку питательные вещества должны находиться в растворенном состоянии и иметь соответствующий размер молекул. Однако это не означает что микроорганизмы не используют высокомолекулярные...
84259. Химический состав микробной клетки 33.69 KB
  Связанная вода входит в состав коллоидов клетки и с трудом высвобождается из них. С потерей связанной воды нарушаются клеточные структуры и наступает гибель клетки. При удалении свободной воды гибели клетки не происходит.
84260. Механизмы поступления питательных веществ в клетку 32.25 KB
  ЦПМ регулирует не только поступление веществ в клетку но и выход из нее воды разнообразных продуктов обмена и ионов что обеспечивает нормальную жизнедеятельность клетки. Существует несколько механизмов транспорта питательных веществ в клетку: простая диффузия облегченная диффузия и активный транспорт. Транспорт веществ через цитоплазматическую мембрану схематично изображен на рис.
84261. Пищевые потребности и типы питания микроорганизмов 42 KB
  В зависимости от источника углерода микроорганизмы делятся на: автотрофы сами себя питающие которые используют углерод из неорганических соединений углекислого газа и карбонатов; гетеротрофы питаются за счет других – используют углерод из органических соединений. В зависимости от источника энергии различают: фототрофы – микроорганизмы которые в качестве источника энергии используют энергию солнечного света; хемотрофы – энергетическим материалом для этих микроорганизмов являются разнообразные органические и неорганические вещества....
84262. Понятие о конструктивном и энергетическом обмене 38.76 KB
  Из веществ среды перенесенных в клетку собираются строительные блоки из которых формируются биополимеры клетки и синтезируются белки жиры углеводы нуклеиновые кислоты и другие клеточные компоненты. Обмен веществ можно рассматривать как сумму двух явлений: катаболизма энергетического обмена представляющего собой ферментативное расщепление крупных органических молекул с выделением свободной энергии которая запасается в виде макроэргических связей в молекулах АТФ; анаболизма конструктивного обмена представляющего собой синтез...
84263. Энергетический метаболизм, его сущность. Макроэргические соединения. Типы фосфорилирования 35.11 KB
  Энергия образуемая при энергетическом обмене трансформируется в энергию макроэргических связей молекул АТФ. Процесс образования АТФ называется фосфорилированием. Механизм образования АТФ у разных групп микроорганизмов неодинаков. Фотофосфорилирование – образование АТФ при поглощении квантов света молекулами хлорофилла.