Spec-Zone .ru
спецификации, руководства, описания, API
След: API Java для XML, Обрабатывающего (JAXP)
Урок: Преобразования Расширяемого языка таблиц стилей
Выписывание ДОМА как XML-файл
Домашняя страница > API Java для XML, Обрабатывающего (JAXP) > Преобразования Расширяемого языка таблиц стилей

Выписывание ДОМА как XML-файл

После того, как Вы создали ДОМА (или анализируя XML-файл, или создавая его программно) Вы часто хотите сохранить его как XML. Этот раздел показывает Вам, как сделать, то использование Xalan преобразовывает пакет.

Используя тот пакет, Вы создадите объект преобразователя соединить проводом DOMSource к StreamResult. Вы тогда вызовете метод transform() преобразователя, чтобы выписать ДОМУ как данные XML.

Чтение XML

Первый шаг должен создать ДОМА в памяти, анализируя XML-файл. К настоящему времени следует становиться довольными процессом.


Отметьте: 

Код, обсужденный в этом разделе, находится в файле TransformationApp01.java. Download the XSLT examlles и разархивируйте их в install-dir/jaxp-1_4_2-release-date/samples каталог.


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

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.FactoryConfigurationError; 
import javax.xml.parsers.ParserConfigurationException; 
import org.xml.sax.SAXException; 
import org.xml.sax.SAXParseException; 

import org.w3c.dom.Document;
import org.w3c.dom.DOMException;

import java.io.*;

public class TransformationApp01 {

    static Document document; 

    public static void main(String argv[]) {
        if (argv.length != 1) {
            System.err.println("Usage: java TransformationApp01 filename");
            System.exit (1);
        }

        DocumentBuilderFactory factory =
        DocumentBuilderFactory.newInstance();

        try {
            File f = new File(argv[0]);
            DocumentBuilder builder =
            factory.newDocumentBuilder();
            document = builder.parse(f);
  
        } 
        catch (SAXParseException spe) {
            // Error generated by the parser
            System.out.println("\n** Parsing error"
                               + ", line " + spe.getLineNumber()
                               + ", uri " + spe.getSystemId());
            System.out.println("  " + spe.getMessage() );
  
            // Use the contained exception, if any
            Exception x = spe;
            if (spe.getException() != null)
                x = spe.getException();
            x.printStackTrace();
        }
        catch (SAXException sxe) {
            // Error generated by this application
            // (or a parser-initialization error)
            Exception x = sxe;
            if (sxe.getException() != null)
                x = sxe.getException();
            x.printStackTrace();
        }
        catch (ParserConfigurationException pce) {
            // Parser with specified options 
            // cannot be built
            pce.printStackTrace();
        }
        catch (IOException ioe) {
            // I/O error
            ioe.printStackTrace();
        }
    }
}

Создание Преобразователя

Следующий шаг должен создать преобразователь, который можно использовать, чтобы передать XML к System.out. Для начала следующие операторы импорта требуются.

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult;
import java.io.*;

Здесь, Вы добавляете серию классов, которые должны теперь формировать стандартный образец: объект (Transformer), фабрика, чтобы создать это (TransformerFactory), и исключения, которые могут быть сгенерированы каждым. Поскольку у преобразования всегда есть источник и результат, Вы тогда импортируете классы, необходимые, чтобы использовать ДОМА в качестве источника (DOMSource) и поток вывода для результата (StreamResult).

Затем, добавьте код, чтобы выполнить преобразование:

try {
    File f = new File(argv[0]);
    DocumentBuilder builder = factory.newDocumentBuilder();
    document = builder.parse(f);

    // Use a Transformer for output
    TransformerFactory tFactory =
    TransformerFactory.newInstance();
    Transformer transformer = 
    tFactory.newTransformer();

    DOMSource source = new DOMSource(document);
    StreamResult result = new StreamResult(System.out);
    transformer.transform(source, result);
}

Здесь, Вы создаете объект преобразователя, используете ДОМА, чтобы создать исходный объект, и использовать System.out, чтобы создать объект результата. Вы тогда говорите преобразователю работать на исходном объекте и выводить к объекту результата.

В этом случае "преобразователь" ничего фактически не изменяет. В терминологии XSLT Вы используете идентификационные данные, преобразовывают, что означает, что "преобразование" генерирует копию источника, неизменного.


Отметьте: 

Можно определить множество выходных свойств для объектов преобразователя, как определено в спецификации W3C в http://www.w3.org/TR/xslt#output. Например, чтобы получить расположенный с отступом вывод, можно вызвать следующий метод:

% transformer.setOutputProperty(OutputKeys.INDENT, "yes");

Наконец, следующий выделенный код фиксирует новые ошибки, которые могут быть сгенерированы:

} 
catch (TransformerConfigurationException tce) {
    System.out.println("* Transformer Factory error");
    System.out.println(" " + tce.getMessage());

    Throwable x = tce;
    if (tce.getException() != null)
        x = tce.getException();
    x.printStackTrace(); 
} 
catch (TransformerException te) {
    System.out.println("* Transformation error");
    System.out.println(" " + te.getMessage());

    Throwable x = te;
    if (te.getException() != null)
        x = te.getException();
    x.printStackTrace();
} 
catch (SAXParseException spe) {
    // ...
}

Примечания

Чтобы узнать больше о конфигурировании фабрики и обработке ошибок проверки допустимости, см. Данные XML Чтения в ДОМА.

Выполнение Выборки TransformationApp01

  1. Переместитесь к каталогу samples.
    % cd install-dir/jaxp-1_4_2-release-date/samples.
    
  2. Download the XSLT examples by clicking this link и разархивируйте их в install-dir/jaxp-1_4_2-release-date/samples каталог.
  3. Переместитесь к каталогу xslt.
    % cd xslt
    
  4. Скомпилируйте выборку TransformationApp01.

    Введите следующую команду:

    % javac TransformationApp01.java
    
  5. Выполните выборку TransformationApp01 на XML-файле.

    В случае ниже, TransformationApp01 выполняется на файле foo.xml, найденный в каталоге xslt/data после того, как Вы разархивировали демонстрационный пакет.

    % java TransformationApp01 data/foo.xml
    

    Вы будете видеть следующий вывод:

    <?xml version="1.0" 
        encoding="UTF-8" 
        standalone="no"?><doc>
      <name first="David" last="Marston"/>
      <name first="David" last="Bertoni"/>
      <name first="Donald" last="Leslie"/>
      <name first="Emily" last="Farmer"/>
      <name first="Joseph" last="Kesselman"/>
      <name first="Myriam" last="Midy"/>
      <name first="Paul" last="Dick"/>
      <name first="Stephen" last="Auriemma"/>
      <name first="Scott" last="Boag"/>
      <name first="Shane" last="Curcuru"/>
    

    Как упомянуто в Создании Преобразователя, этот преобразователь ничего фактически не изменил, а скорее только что выполнил идентификационные данные, преобразовывают, чтобы генерировать копию источника. Реальное преобразование будет выполняться в Генерировании XML от Произвольной Структуры данных.

Выписывание Поддерева ДОМА

Также возможно работать на поддереве ДОМА. В этом разделе Вы будете экспериментировать с той опцией.


Отметьте: 

Код, обсужденный в этом разделе, находится в TranformationApp02.java. Если Вы так уже не сделали, download the XSLT examples и разархивируйте их в install-dir/jaxp-1_4_2-release-date/samples каталог.


Единственная разница в процессе - то, что теперь Вы создадите DOMSource, используя узел в ДОМЕ, а не всем ДОМЕ. Первый шаг должен импортировать классы, Вы должны получить узел, который Вы хотите, как показано в следующем выделенном коде:

import org.w3c.dom.Document;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList; 

Следующий шаг должен найти хороший узел для эксперимента. Следующий выделенный код выбирает первый элемент <name>.

try {
    File f = new File(argv[0]);
    DocumentBuilder builder = factory.newDocumentBuilder();
    document = builder.parse(f);

    NodeList list = document.getElementsByTagName("name");
    Node node = list.item(0); 
}

В Создании Преобразователя исходный объект был создан из всего документа следующей строкой кода

DOMSource source = new DOMSource(document);

Однако, выделенная строка кода ниже создает исходный объект, который состоит из поддерева, базированного в определенном узле.

DOMSource source = new DOMSource(node);
StreamResult result = new StreamResult(System.out);
transformer.transform(source, result);

Выполнение Выборки TranformationApp02

  1. Переместитесь к каталогу samples.
    % cd install-dir/jaxp-1_4_2-release-date/samples.
    
  2. Download the XSLT examples by clicking this link и разархивируйте их в install-dir/jaxp-1_4_2-release-date/samples каталог.
  3. Переместитесь к каталогу xslt.
    cd xslt
    
  4. Скомпилируйте выборку TranformationApp02.

    Введите следующую команду:

    % javac xslt/TranformationApp02.java
    
  5. Выполните выборку TranformationApp02 на XML-файле.

    В случае ниже, TranformationApp02 выполняется на файле foo.xml, найденный в каталоге xslt/data после того, как Вы разархивировали демонстрационный пакет.

    % java TranformationApp02 data/foo.xml
    

    Вы будете видеть следующий вывод:

    <?xml version="1.0" encoding="UTF-8" 
        standalone="no"?><doc><name 
        first="David" last="Marston"/>
    

    На сей раз только первый элемент <name> был распечатан.

    В этой точке Вы видели, как использовать преобразователь, чтобы выписать ДОМУ и как использовать поддерево ДОМА как исходный объект в преобразовании. В следующем разделе Вы будете видеть, как использовать преобразователь, чтобы создать XML из любой структуры данных, Вы способны к парсингу.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Работы XPath
Следующая страница: Генерирование XML от Произвольной Структуры данных