АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

XMLStreamConstants.ENTITY_DECLARATION

Далее данные извлекаются применением методов:

String getLocalName() – возвращает название тега;

String getAttributeValue(NAMESPACE_URI, ATTRIBUTE_NAME) – возвращает значение атрибута;

String getText() – возвращает текст тега.

Пусть дан XML-документ с описанием медиатехники.

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

<products xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=" products.xsd">

<category name="Audio And Video">

<subcategory name="Audio">

<product>

<producer>Samsung</producer>

<model>NV678</model>

<year>12-12-2006</year>

<color>White</color>

<notAvailable />

</product>

</subcategory>

<subcategory name="Video">

<product>

<producer>Samsung</producer>

<model>VH500</model>

<year>12-12-2004</year>

<color>Black</color>

<cost>200</cost>

</product>

<product>

<producer>Samsung</producer>

<model>VH500</model>

<year>12-12-2004</year>

<color>White</color>

<notAvailable />

</product>

</subcategory>

</category>

<category name="Computers">

<subcategory name="Pocket">

<product>

<producer>HP</producer>

<model>rx371</model>

<year>31-01-2006</year>

<color>Black</color>

<notAvailable />

</product>

</subcategory>

</category>

</products>

Организация процесса разбора документа XML с помощью StAX приведена в следующем примере:

/* пример # 12: реализация разбора XM-документа: StAXProductParser.java: ProductParser.java: ParserEnum.java */

package chapt16;

public enum ParserEnum {

PRODUCTS, CATEGORY, SUBCATEGORY, PRODUCT, PRODUCER, MODEL, YEAR, COLOR, NOTAVAILABLE, COST, NAME

}

package chapt16;

import java.io.InputStream;

 

public abstract class ProductParser {

public abstract void parse(InputStream input);

 

public void writeTitle() {

System. out. println("Products:");

}

public void writeCategoryStart(String name) {

System. out. println("Category: " + name.trim());

}

public void writeCategoryEnd() {

System. out. println();

}

public void writeSubcategoryStart(String name) {

System. out. println("Subcategory: " + name.trim());

}

public void writeSubcategoryEnd() {

System. out. println();

}

public void writeProductStart() {

System. out. println(" Product Start ");

}

public void writeProductEnd() {

System. out. println(" Product End ");

}

public void writeProductFeatureStart(String name) {

switch (ParserEnum. valueOf (name.toUpperCase())) {

case PRODUCER:

System. out. print("Provider: ");

break;

case MODEL:

System. out. print("Model: ");

break;

case YEAR:

System. out. print("Date of issue: ");

break;

case COLOR:

System. out. print("Color: ");

break;

case NOTAVAILABLE:

System. out. print("Not available");

break;

case COST:

System. out. print("Cost: ");

break;

}

}

public void writeProductFeatureEnd() {

System. out. println();

}

 

public void writeText(String text) {

System. out. print(text.trim());

}

}

package chapt16;

import javax.xml.stream.XMLInputFactory;

import javax.xml.stream.XMLStreamConstants;

import javax.xml.stream.XMLStreamException;

import javax.xml.stream.XMLStreamReader;

import java.io.InputStream;

 

public class StAXProductParser extends ProductParser {

// реализация абстрактного метода из суперкласса для разбора потока

public void parse(InputStream input) {

XMLInputFactory inputFactory =

XMLInputFactory. newInstance ();

try {

XMLStreamReader reader =

inputFactory.createXMLStreamReader(input);

process(reader);

} catch (XMLStreamException e) {

e.printStackTrace();

}

}

// метод, управляющий разбором потока

public void process(XMLStreamReader reader)

throws XMLStreamException {

String name;

 

while (reader.hasNext()) {

// определение типа "прочтённого" элемента (тега)

int type = reader.next();

 

switch (type) {

case XMLStreamConstants. START_ELEMENT:

name = reader.getLocalName();

 

switch (ParserEnum. valueOf (name.toUpperCase())) {

case PRODUCTS:

writeTitle();

break;

case CATEGORY:

writeCategoryStart(reader.getAttributeValue(null,

ParserEnum. NAME. name().toLowerCase()));

break;

case SUBCATEGORY:

writeSubcategoryStart(reader.getAttributeValue(null,

ParserEnum. NAME. name().toLowerCase()));

break;

case PRODUCT:

writeProductStart();

break;

default:

writeProductFeatureStart(name);

break;

}

break;

 

case XMLStreamConstants. END_ELEMENT:

name = reader.getLocalName();

 

switch (ParserEnum. valueOf (name.toUpperCase())) {

case CATEGORY:

writeCategoryEnd();

break;

case SUBCATEGORY:

writeSubcategoryEnd();

break;

case PRODUCT:

writeProductEnd();

break;

default:

writeProductFeatureEnd();

break;

}

break;

 

case XMLStreamConstants. CHARACTERS:

writeText(reader.getText());

break;

 

default:

break;

}

}

}

}

Для запуска приложения разбора документа с помощью StAX ниже приведен достаточно простой код:

/* пример # 13: запуск приложения: StreamOutputExample.java*/

package chapt16;

import java.io.FileInputStream;

import java.io.InputStream;

 

public class StreamOutputExample {

public static void main(String[] args) throws Exception {

ProductParser parser = new StAXProductParser();

// создание входного потока данных из xml-файла

InputStream input =

new FileInputStream("chapt16\\mediatech.xml");

// разбор файла с выводом результата на консоль

parser.parse(input);

}

}

XSL

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

Существует два стандарта стилевых таблиц, опубликованных W3C. Это CSS (Cascading Stylesheet) и XSL (XML Stylesheet Language).

CSS изначально разрабатывался для HTML и представляет из себя набор инструкций, которые указывают браузеру, какой шрифт, размер, цвет использовать для отображения элементов HTML-документа.

XSL более современен, чем CSS, потому что используется для преобразования XML-документа перед отображением. Так, используя XSL, можно построить оглавление для XML-документа, представляющего книгу.

Вообще XSL можно разделить на три части: XSLT (XSL Transformation), XPath и XSLFO (XSL Formatting Objects).

XSL Processor необходим для преобразования XML-документа согласно инструкциям, находящимся в файле таблицы стилей.

XSLT

Этот язык для описания преобразований XML-документа применяется не только для приведения XML-документов к некоторому “читаемому” виду, но и для изменения структуры XML-документа.

К примеру, XSLT можно использовать для:

· удаления существующих или добавления новых элементов в XML-документ;

· создания нового XML-документа на основании заданного;

· извлечения информации из XML-документа с разной степенью детализации;

· преобразования XML-документа в документ HTML или документ другого типа.

Пусть требуется построить новый XML-файл на основе файла
students.xml, у которого будет удален атрибут login. Элементы country, city, street станут атрибутами элемента address и элемент telephone станет дочерним элементом элемента address. Следует воспользоваться XSLT для решения данной задачи. В следующем коде приведено содержимое файла таблицы стилей students.xsl, решающее поставленную задачу.

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" />

<xsl:template match="/">

<students>

<xsl:apply-templates />

</students>

</xsl:template>

<xsl:template match="student">

<xsl:element name="student">

<xsl:attribute name="faculty">

<xsl:value-of select="@faculty"/>

</xsl:attribute>

<name><xsl:value-of select="name"/></name>

<xsl:element name="address">

<xsl:attribute name="country">

<xsl:value-of select="address/country"/>

</xsl:attribute>

<xsl:attribute name="city">

<xsl:value-of select="address/city"/>

</xsl:attribute>

<xsl:attribute name="street">

<xsl:value-of select="address/street"/>

</xsl:attribute>

<xsl:element name="telephone">

<xsl:attribute name="number">

<xsl:value-of select="telephone"/>

</xsl:attribute>

</xsl:element>

</xsl:element>

</xsl:element>

</xsl:template>

</xsl:stylesheet>

Преобразование XSL лучше сделать более коротким, используя ATV (attribute template value), т.е «{}»

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

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="xml" />

<xsl:template match="/">

<students>

<xsl:apply-templates />

</students>

</xsl:template>

<xsl:template match="student">

<student faculty=”{@faculty}">

<name><xsl:value-of select="name"/></name>

<address country=”{address/country}"

city=”{address/city}”

street=”{address/street}”>

<telephone number="{telephone}"/>

</address>

</student>

</xsl:template>

</xsl:stylesheet>

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

/* пример # 14: трансформация XML: SimpleTransform.java */

import javax.xml.transform.Transformer;

import javax.xml.transform.TransformerException;

import javax.xml.transform.TransformerFactory;

import javax.xml.transform.stream.StreamResult;

import javax.xml.transform.stream.StreamSource;

 

public class SimpleTransform {

public static void main(String[] args) {

try {

TransformerFactory tf =

TransformerFactory. newInstance ();

 

//установка используемого XSL-преобразования

Transformer transformer =

tf.newTransformer(new StreamSource("students.xsl"));

 

//установка исходного XML-документа и конечного XML-файла

transformer.transform(

new StreamSource("students.xml"),

new StreamResult("newstudents.xml"));

 

System. out. print("complete");

} catch (TransformerException e) {

e.printStackTrace();

}

}

}

В результате получится XML-документ newstudents.xml следующего вида:

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

<students>

<student faculty="mmf">

<name>Mitar Alex</name>

<address country="Belarus" city="Minsk"

street="Kalinovsky 45">

<telephone number="3462356"/>

</address>

</student>

<student faculty="mmf">

<name>Pashkun Alex</name>

<address country="Belarus" city="Brest"

street="Knorina 56">

<telephone number="4582356"/>

</address>

</student>

</students>

Элементы таблицы стилей

Таблица стилей представляет собой well-formed XML-документ. Эта таблица описывает изначальный документ, конечный документ и то, как трансформировать один документ в другой.

Какие же элементы используются в данном листинге?

<xsl:output method="xml" indent="yes"/>

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

<xsl:template match="student">

<lastname>

<xsl:apply-templates/>

</lastname>

</xsl:template>

Инструкция <xsl:template...> задает шаблон преобразования. Набор шаблонов преобразования составляет основную часть таблицы стилей. В предыдущем примере приводится шаблон, который преобразует элемент student в элемент lastname.

Шаблон состоит из двух частей:

1) параметр match, который задает элемент или множество элементов в исходном дереве, где будет применяться данный шаблон;

2) содержимое шаблона, которое будет вставлено в конечный документ.

Нужно отметить, что содержимое параметра math может быть довольно сложным. В предыдущем примере просто ограничились именем элемента. Но, к примеру, следующее содержимое параметра math указывает на то, что шаблон должен применяться к элементу url, содержащему атрибут protocol со значением mailto:

<xsl:template match=”url[@protocol=’mailto’]”>

Кроме этого, существует набор функций, которые также могут использоваться при объявлении шаблона:

<xsl:template match=”chapter[position()=2]”>

Данный шаблон будет применен ко второму по счету элементу chapter исходного документа.

Инструкция <xsl:apply-templates/> сообщает XSL-процессору о том, что нужно перейти к просмотру дочерних элементов. Эта запись означает в расширенном виде:

<xsl:apply-templates select=”child::node()” />

XSL-процессор работает по следующему алгоритму. После загрузки исходного XML-документа и таблицы стилей процессор просматривает весь документ от корня до листьев. На каждом шагу процессор пытается применить к данному элементу некоторый шаблон преобразования; если в таблице стилей для текущего просматриваемого элемента есть шаблон, процессор вставляет в результирующий документ содержимое этого шаблона. Когда процессор встречает инструкцию <xsl:apply-templates/>, он переходит к дочерним элементам текущего узла и повторяет процесс, т.е. пытается для каждого дочернего элемента найти соответствие в таблице стилей.

Задания к главе 16

Вариант А

Создать файл XML и соответствующее ему DTD-определение. Задать схему XSD. Определить класс Java, соответствующий данному описанию. Создать Java-приложение для инициализации массива объектов информацией из XML-файла. Произвести проверку XML-документа с привлечением DTD и XSD. Определить метод, производящий преобразование данного XML-документа в документ, указанный в задании.

1. Оранжерея.

Растения, содержащиеся в оранжерее, имеют следующие характеристики:

· Name – название растения.

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

· Origin – место происхождения растения.

· Visual рarameters (должно быть несколько) – внешние параметры: цвет стебля, цвет листьев, средний размер растения.

· Growing tips (должно быть несколько) – предпочитаемые условия произрастания: температура (в градусах), освещение (светолюбиво либо нет), полив (мл в неделю).

· Multiplying – размножение: листьями, черенками либо семенами.

Корневой элемент назвать Flower.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 растений. С помощью XSL преобразовать данный файл в формат HTML, где отобразить растения по предпочитаемой тем­пературе (по возрастанию).

2. Алмазный фонд.

Драгоценные и полудрагоценные камни, содержащиеся в павильоне, имеют следующие характеристики:

· Name – название камня.

· Preciousness – может быть драгоценным либо полудрагоценным.

· Origin – место добывания.

· Visual parameters (должно быть несколько) – могут быть: цвет (зеленый, красный, желтый и т.д.), прозрачность (измеряется в процентах
0-100%), способы огранки (количество граней 4-15).

· Value – вес камня (измеряется в каратах).

Корневой элемент назвать Gem.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 камней. С помощью XSL преобразовать данный файл в формат XML, где корневым элементом будет место происхождения.

3. Тарифы мобильных компаний.

Тарифы мобильных компаний могут иметь следующую структуру:

· Name – название тарифа.

· Operator name – название сотового оператора, которому принадлежит тариф.

· Payroll – абонентская плата в месяц (0 – n рублей).

· Сall prices (должно быть несколько) – цены на звонки: внутри сети
(0 – n рублей в минуту), вне сети (0 – n рублей в минуту), на стационарные телефоны (0 – n рублей в минуту).

· SMS price – цена за смс (0 – n рублей).

· Parameters (должно быть несколько) – наличие любимого номера
(0 – n), тарификация (12-секундная, минутная), плата за подключение
к тарифу (0 – n рублей).

Корневой элемент назвать Tariff.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 тарифов. С помощью XSL преобразовать данный файл в формат НTML, при выводе отсортировать тарифы по абонентской плате.

4. Лекарственные препараты.

Лекарственные препараты имеют следующие характеристики.

· Name – название препарата.

· Price – цена за упаковку (0 – n рублей).

· Dosage – дозировка препарата (мг/день).

· Visual (должно быть несколько) – визуальные характеристики препарата: цвет (белый, желтый, зеленый, красный), консистенция (жидкий, порошкообразный, твердый), показания к применению (респираторные заболевания, расстройства организма, психические заболевания, общеукрепляющее).

Корневой элемент назвать Medicine.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 лекарств. С помощью XSL преобразовать данный файл в формат НTML, при выводе отсортировать лекарства по цене.

5. Компьютер.

Компьютерные комплектующие имеют следующие характеристики:

· Name – название комплектующего.

· Origin – страна производства.

· Price – цена (0 – n рублей).

· Type (должно быть несколько) – периферийное либо нет, энергопотребление (ватт), наличие кулера (есть либо нет), группа комплектующих (устройства ввода-вывода, мультимедийные), порты (COM, USB, LPT).

· Critical – критично ли наличие комплектующего для работы компьютера.

Корневой элемент назвать Device.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 устройств. С помощью XSL преобразовать данный файл в формат XML, при выводе корневым элементом сделать Critical.

6. Огнестрельное оружие.

Огнестрельное оружие можно структурировать по следующей схеме:

· Model – название модели.

· Handy – одно- или двуручное.

· Origin – страна производства.

· TTC (должно быть несколько) – тактико-технические характеристики: дальнобойность (близкая [0 – 500м], средняя [500 – 1000 м], дальняя [1000 – n метров]), прицельная дальность (в метрах), наличие обоймы, наличие оптики.

· Material – материал изготовления.

Корневой элемент назвать Gun.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 видов. С помощью XSL преобразовать данный файл в формат XML, при выводе корневым элементом сделать страну производства.

7. Холодное оружие.

Холодное оружие можно структурировать по следующей схеме:

· Type – тип (нож, кинжал, сабля и т.д.).

· Handy – одно или двуручное.

· Origin – страна производства.

· Visual (должно быть несколько) – визуальные характеристики: клинок (длина клинка [10 – n см], ширина клинка [10 – n мм]), материал (клинок [сталь, чугун, медь и т.д.]), рукоять (деревянная [если да, то указать тип дерева], пластик, металл), наличие кровостока (есть либо нет).

· Value – коллекционный либо нет.

Корневой элемент назвать Knife.

Создать XML файл, отображающий заданную тему, привести при­меры 4-5 видов. С помощью XSL преобразовать данный файл в формат HTML, при выводе отсортировать по длине клинка.

8. Военные самолеты.

Военные самолеты можно описать по следующей схеме:

· Model – название модели.

· Origin – страна производства.

· Chars (должно быть несколько) – характеристики, могут быть следующими: тип (самолет поддержки, сопровождения, истребитель, перехватчик, разведчик), кол-во мест (1 либо 2), боекомплект (есть либо нет [разведчик], если есть, то: ракеты [0 – 10]), наличие радара.

· Parameters – длина (в метрах), ширина (в метрах), высота (в метрах).

· Price – цена (в долларах).

Корневой элемент назвать Plane.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 типов самолетов. С помощью XSL преобразовать данный файл в формат HTML, при выводе отсортировать по стоимости.

9. Конфеты.

· Name – название конфеты.

· Energy– калорийность (ккал).

· Type (должно быть несколько) – тип конфеты (карамель, ирис, шоколадная [с начинкой либо нет]).

· Ingredients (должно быть несколько) – ингредиенты: вода, сахар (в мг), фруктоза (в мг), тип шоколада (для шоколадных), ванилин (в мг)

· Value – пищевая ценность: белки (в гр.), жиры (в гр.) и углеводы (в гр.).

· Production – предприятие-изготовитель.

Корневой элемент назвать Candy.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 конфет. С помощью XSL преобразовать данный файл в формат HTML, при выводе отсортировать по месту изготовления.

10. Пиво.

· Name – название пива.

· Type – тип пива (темное, светлое, лагерное, живое).

· Al – алкогольное либо нет.

· Manufacturer – фирма-производитель.

· Ingredients (должно быть несколько) – ингредиенты: вода, солод, хмель, сахар и т.д.

· Chars (должно быть несколько) – характеристики: кол-во оборотов (если алкогольное), прозрачность (в процентах), фильтрованное либо нет, пищевая ценность (ккал), способ разлива (объем и материал емкостей)

· Корневой элемент назвать Beer.

Создать XML-файл, отображающий заданную тему, привести примеры 4-5 сортов пива. С помощью XSL преобразовать данный файл в формат XML, при выводе корневым элементом сделать производителя.

11. Периодические издания.

· Title – название издания.

· Type – тип издания (газета, журнал, буклет).

· Monthly – ежемесячное либо нет.

· Chars (должно быть несколько) – характеристики: цветное (да либо нет), объем (n страниц), глянцевое (да [только для журналов и буклетов] либо нет [для газет]), имеет подписной индекс (только для газет и журналов).

Корневой элемент назвать Paper.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 типов периодики. С помощью XSL преобразовать данный файл в формат XML, при выводе корневым элементом сделать тип (Type).

12. Интернет-страницы.

· Title – название страницы.

· Type – тип страницы (рекламный, страница новостей, портал, зеркало).

· Chars (должно быть несколько) – наличие электронного ящика (толь­ко для порталов, зеркал и страниц новостей), наличие новостей (только для страниц новостей), наличие архивов для выкачивания (только для зеркал), наличие голосования (есть[если есть, то анонимное либо с применением авторизации] либо нет), платный (информация, до-
ступная для выкачивания, бесплатна либо нет).

· Authorize – необходима либо нет авторизация.

Корневой элемент назвать Site.

Создать XML файл, отображающий заданную тему, привести примеры 4-5 типов периодики. С помощью XSL преобразовать данный файл в формат XML, при выводе корневым элементом сделать тип (Type).

Тестовые задания к главе 16


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.058 сек.)