Spec-Zone .ru
спецификации, руководства, описания, API
|
После того, как Вы создали ДОМА (или анализируя XML-файл, или создавая его программно) Вы часто хотите сохранить его как XML. Этот раздел показывает Вам, как сделать, то использование Xalan преобразовывает пакет.
Используя тот пакет, Вы создадите объект преобразователя соединить проводом DOMSource к StreamResult. Вы тогда вызовете метод transform() преобразователя, чтобы выписать ДОМУ как данные 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) { // ... }
Примечания
import javax.xml.transform.OutputKeys; ... if (document.getDoctype() != null) { String systemValue = (new File (document.getDoctype().getSystemId())).getName(); transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, systemValue); }
Чтобы узнать больше о конфигурировании фабрики и обработке ошибок проверки допустимости, см.
% cd install-dir/jaxp-1_4_2-release-date/samples.
Download the XSLT examples by clicking this link
и разархивируйте их в install-dir/jaxp-1_4_2-release-date/samples каталог.% cd xslt
Введите следующую команду:
% javac TransformationApp01.java
В случае ниже, 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);
% cd install-dir/jaxp-1_4_2-release-date/samples.
Download the XSLT examples by clicking this link
и разархивируйте их в install-dir/jaxp-1_4_2-release-date/samples каталог.cd xslt
Введите следующую команду:
% javac xslt/TranformationApp02.java
В случае ниже, 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 из любой структуры данных, Вы способны к парсингу.