Сравнение XML с другими форматами
Обрабатывать XML-документ относительно легко по сравнению с двоичным или неструктурированным форматом. Это из-за следующих характеристик:
- простой текст
- представляет данные без определения способа отображения данных
- может быть преобразован в другие форматы через XSL
- может быть легко обработан с помощью стандартных анализаторов
- XML-файлы являются иерархическими
Если данные представлены в виде XML, размер этих данных является относительно большим по сравнению с другими форматами. JSON или двоичные форматы часто используются для замены, если важна пропускная способность данных.
insertAdjacentHTML/Text/Element
С этим может помочь другой, довольно универсальный метод: elem.insertAdjacentHTML(where, html).
Первый параметр – это специальное слово, указывающее, куда по отношению к элементу elem производить вставку. Значение должно быть одним из следующих:
- «beforebegin» – вставить html непосредственно перед элементом,
- «afterbegin» – вставить html в начало элемента,
- «beforeend» – вставить html в конец элемента,
- «afterend» – вставить html непосредственно после элемента.
Второй параметр – это HTML-строка, которая будет вставлена именно «как HTML».
Например:
<div id="div"></div> <script> div.insertAdjacentHTML('beforebegin', '<p>Привет</p>'); div.insertAdjacentHTML('afterend', '<p>Пока</p>'); </script>
Приведёт к:
<p>Привет</p> <div id="div"></div> <p>Пока</p>
Так мы можем добавлять произвольный HTML на страницу.
Варианты вставки:
Мы можем легко заметить сходство между этой и предыдущей картинкой. Точки вставки фактически одинаковые, но этот метод вставляет код HTML.
У метода есть два брата:
- elem.insertAdjacentText(where, text) – такой же синтаксис, но строка text вставляется «как текст», вместо HTML,
- elem.insertAdjacentElement(where, elem) – такой же синтаксис, но вставляет элемент elem.
Они существуют, в основном, чтобы унифицировать синтаксис. На практике часто используется только insertAdjacentHTML. Потому что для элементов и текста у нас есть методы append/prepend/before/after – их быстрее написать, и они могут вставлять как узлы, так и собственно текст.
Так что, вот альтернативный вариант показа сообщения:
Git Essentials
Ознакомьтесь с этим практическим руководством по изучению Git, содержащим лучшие практики и принятые в отрасли стандарты. Прекратите гуглить команды Git и на самом деле изучите это!
public class Solution { public static void main(String[] args) throws Exception { Person person = XMLtoPersonExample("person.xml"); System.out.println(person); } private static Person XMLtoPersonExample(String filename) throws Exception { File file = new File(filename); JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); return (Person) jaxbUnmarshaller.unmarshal(file); } }
После запуска этого кода вы должны увидеть что-то вроде:
Person{name='Benjamin Watson', age=31, isMarried=true, hobbies=, kids=}
Сортировка
Чтобы продемонстрировать способность JAXB писать XML-файл, используя объект Java в качестве источника, мы добавим следующий метод:
private static void personToXMLExample(String filename, Person person) throws Exception { File file = new File(filename); JAXBContext jaxbContext = JAXBContext.newInstance(Person.class); Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); jaxbMarshaller.marshal(person, file); jaxbMarshaller.marshal(person, System.out); }
Это очень похоже на предыдущий пример и включает в себя повторное создание . На этот раз процесс пойдет в обратном направлении, и выходные данные XML будут записаны в файл и консоль.
Добавив вызов этого метода в качестве последней строки в как:
personToXMLExample("person-output.xml", person);
и запустив его, мы получим досадное исключение.
Exception in thread "main" java.lang.NullPointerException at com.stackabuse.xml.Person.isMarried(Person.java:49) at com.stackabuse.xml.Person$JaxbAccessorM_isMarried_setMarried_boolean.get(MethodAccessor_Boolean.java:61) ...
Мы допустили ошибку , установив тип поля в класс-оболочку и возвращаемый тип геттера в примитивный , что приводит к тому, что JAXB пытается распаковать и в результате выдает .
Быстрое и простое решение этой проблемы состояло бы в том, чтобы выровнять эти два значения либо , либо .
После устранения проблемы мы получим следующие выходные данные как для консоли, так и для файла:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>31FootballSwimming5Billy3MillytrueBenjamin Watson
Как мы видим, он полностью идентичен исходному XML-файлу, который мы собрали в объект .
Вывод
Чтение и запись XML на Java можно легко выполнить с помощью платформы JAXB. Используя аннотации, мы определяем правила сопоставления между классами Java и XML-документами, представляющими их объекты.
XML часто считается устаревшим форматом, который уступает JSON. Однако знание того, как читать и писать его с помощью Java, является полезным навыком для любого разработчика программного обеспечения, поскольку многие службы в Интернете все еще используют его и еще не имеют API JSON. Это также относится ко многим форматам файлов, которые хранят данные в файлах в формате XML.
Хотя, если вам больше нравится JSON, я бы посоветовал почитать о чтении и записи JSON на Java, мы тоже об этом позаботились!
Вставка элементов и текстовых узлов
Чтобы созданный элемент (или текстовый узел) появился в нужном месте страницы его необходимо туда вставить.
Выполнить в JavaScript это можно посредством различных методов.
Одни из самых старых – и .
appendChild
предназначен для вставки узла в конец элемента (т.е. после последнего его дочернего узла) для которого этот метод вызывается:
// $elem – элемент, во внутрь которого после последнего его дочернего узла необходимо вставить узел $node $elem.appendChild($node);
В качестве результата этот метод возвращает добавленный на страницу узел.
Пример, в котором добавим новый в конец :
<ol id="colors"> <li>Красный</li> <li>Оранжевый</li> <li>Жёлтый</li> <li>Зелёный</li> <li>Голубой</li> <li>Синий</li> </ol> <script> const $newLi = document.createElement('li'); $newLi.textContent = 'Фиолетовый'; const $colors = document.querySelector('#colors'); $colors.appendChild($newLi); </script>
insertBefore
предназначен для вставки узла перед в :
$elem.insertBefore(node, nextSibling);
Если в качестве передать , то данный метод вставит после последнего дочернего узла . Т.е. выполнит действия аналогично .
В качестве результата метод возвращает вставленный узел.
Например, вставим новый элемент перед третьим:
<ol id="colors"> <li>Красный</li> <li>Оранжевый</li> <li>Зелёный</li> <li>Голубой</li> <li>Синий</li> <li>Фиолетовый</li> </ol> <script> const $newLi = document.createElement('li'); $newLi.textContent = 'Жёлтый'; const $colors = document.querySelector('#colors'); $colors.insertBefore($newLi, $colors.children); </script>
Современные методы вставки и замены
В JavaScript имеются следующие современные методы для вставки элементов и строк:
- – для добавления узлов или строк в конец ;
- – для вставки узлов или строк в начало ;
- – для вставки узлов или строк до ;
- – для вставки узлов или строк после .
Пример использования методов:
<div id="message"> <p>message...</p> </div> <script> const $message = document.querySelector('#message'); // вставим строку «before» перед $message $message.before('before'); // вставим строку «after» перед $message $message.after('after'); const $p1 = document.createElement('p'); $p1.textContent = 'prepend'; // вставим элемент $p1 в начало $message $message.prepend($p1); const $p2 = document.createElement('p'); $p2.textContent = 'append'; // вставим элемент $p2 в конец $message $message.append($p2); </script>
В результате:
before <div id="message"> <p>prepend</p> <p>message...</p> <p>append</p> </div> after
InsertAdjacent
В JavaScript имеется набор методов insertAdjacent, которые позволяют вставить один или несколько узлов в указанную позицию относительно
Всего существует 3 таких метода:
- – для вставки элемента ();
- – для вставки строки () как HTML;
- $elem.insertAdjacentText(position, string) – для вставки строки ();
Значение , может быть, одним из следующих:
- – непосредственно перед ;
- – перед первым дочерним узлом ;
- – после последнего дочернего узла ;
- – сразу после ;
Пример использования :
<ul id="list"> <li>CSS</li> </ul> <script> const $list = document.querySelector('#list'); $list.insertAdjacentHTML('beforebegin', '<h2>Веб-технологии</h2>'); $list.insertAdjacentHTML('afterbegin', '<li>HTML</li>'); $list.insertAdjacentHTML('beforeend', '<li>JavaScript</li>'); $list.insertAdjacentHTML('afterend', '<p>Для фронтенд разработчиков</p>'); </script>
Результат:
<h2>Веб-технологии</h2> <!-- beforebegin --> <ul id="list"> <!-- целевой элемент --> <li>HTML</li> <!-- afterbegin --> <li>CSS</li> <li>JavaScript</li> <!-- beforeend --> </ul> <p>Для фронтенд разработчиков</p> <!-- afterend -->
Создание XML-документа
обычный текстовый файлструктуру документа и его содержание
2.1. Структура XML-документа
Заголовка (пролога)Важная деловая встреча Надо встретиться с Иваном Ивановичем, предварительно позвонив ему по телефону 123-12-12 …Позвонить домой124-13-13Заголовок XML-документа— 1.0;объявлениеНапример:Элемент ДокументДокументПримечание.Важно!1. Язык XML является чувствительным к регистру символов, поэтому как открывающий, так и закрывающий теги должны быть записаны символами в одном регистре.Неверно Верно content content content …The Adventures of Huckleberry FinnMark Twainmass market paperback298$5.49Moby-DickHerman Melvilletrade paperback605$4.95The Scarlet LetterNathaniel Hawthornetrade paperback253$4.25элементовПримечание3
Способы отображения XML-документатри
- Таблица стилей. С помощью данного метода вы связываете таблицу стилей с XML-документом. Таблица стилей представляет собой отдельный файл, содержащий инструкции для форматирования индивидуальных XML-элементов. Вы можете использовать либо каскадную таблицу стилей (Cascading Style Sheet — CSS), которая также применяется для HTML-страниц, либо расширяемую таблицу в формате языка стилевых таблиц (Extensible Stylesheet Language — XSL), обладающую более широкими возможностями, нежели CSS, и разработанную специально для XML-документов.
- Связывание данных. Этот метод требует создания HTML-страницы, связывания с ней XML-документа и установления взаимодействий стандартных HTML-элементов на странице, таких как SPAN или TABLE, с элементами XML. В дальнейшем HTML-элементы автоматически отображают информацию из связанных с ними XML-элементов.
- Написание сценария. В этом методе вы создаете HTML-страницу, связываете ее с XML-документом и имеете доступ к отдельным XML-элементам с помощью специально написанного кода сценария (JavaScript или VBScript). Браузер воспринимает XML-документ как объектную модель документа (Document Object Model — DOM), состоящую из большого набора объектов, свойств и команд. Написанный код позволяет осуществлять доступ, отображение и манипулирование XML-элементами.
Внешние ссылки [ править ]
- — описывает весь синтаксис и семантику XSLT 1.0.
- по — от W3Schools
vтеXSL |
---|
|
vтеКонсорциум World Wide Web (W3C) | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Продукция и стандарты |
|
||||||||||||||
Организации |
|
||||||||||||||
Программного обеспечения |
|
||||||||||||||
Конференции |
|
Функции, определенные XSLT [ править ]
Следующие функции могут встречаться во многих атрибутах XSLT, таких как xsl: value-of.select и xsl: for-each.select.
Функция | Описание / синтаксис | Пример |
---|---|---|
потолок | Функция потолка возвращает наименьшее целое число , которое больше или равно числовому значению числового аргумента. |
потолок ( 3,57 ) |
concat | Объединяет две или более строк. |
concat ( $ fname , '' , $ lname ) |
содержит | Возвращает true, если первая строка содержит вторую строку, в противном случае возвращает false. |
содержит ( 'строка для поиска' , 'найти' ) |
считать | Функция count подсчитывает и возвращает количество узлов в наборе узлов. |
количество ( элементы ) |
этаж | Функция floor возвращает наибольшее целое число, которое меньше или равно числовому значению числового аргумента. |
этаж ( 3.57 ) |
нормализовать пространство | Удаляет пробелы из начала и конца строки |
нормализованное пространство ( $ fname ) |
позиция | Функция position возвращает отсчитываемый от единицы индекс текущего узла, обрабатываемого списком узлов элемента xsl: for-each или xsl: apply-templates . Нет никаких аргументов. |
позиция () |
круглый | Функция round округляет число до ближайшего целого. |
круглый ( 3.57 ) |
нить | Строковая функция преобразует аргумент значения в строку. |
строка () |
длина строки | Функция длины строки возвращает количество символов в строке. Строковый аргумент не является обязательным. Если он опущен, по умолчанию используется строковое значение контекстного узла. |
длина строки ( 'привет' ) |
подстрока | Сегмент внутри значения переменной. Подстрока принимает три параметра: входную переменную, первый выбираемый символ и длину результирующей строки. |
подстрока ( $ dob , 4 , 2 ) |
подстрока после | Функция substring-after возвращает часть строки, указанной в строковом аргументе, которая появляется после подстроки, указанной в аргументе подстроки. |
substring-after ( 'В 1814 году мы совершили небольшое путешествие' , 'мы' ) |
подстрока перед | Функция substring-before возвращает часть строки, указанной в строковом аргументе, которая встречается перед подстрокой, указанной в аргументе substring. |
substring-before ( 'В 1814 году мы совершили небольшое путешествие' , 'мы' ) |
сумма | Функция sum складывает и возвращает общее значение набора числовых значений в наборе узлов или списке значений. |
сумма ( 1 , 3 , 7 , 12 ) |
переведите | Принимает строку в аргументе значения, заменяет все вхождения символов в аргументе string1 на заменяющие символы в том же месте в аргументе string2 и возвращает измененную строку. |
translate ( 'группа' , 'abcd' , 'ABCD' ) = 'BAnD' |
Как сортировать
Вы можете отсортировать с помощью метода Collections sort().
Сортировка сопоставимых объектов
Если список содержит объекты, которые реализуют интерфейс Comparable(java.lang.Comparable), то эти объекты могут сравнивать себя друг с другом. В этом случае вы можете отсортировать следующим образом:
List list = new ArrayList(); list.add("c"); list.add("b"); list.add("a"); Collections.sort(list);
Класс Java String реализует интерфейс Comparable, вы можете сортировать их в естественном порядке, используя метод Collections sort().
Сортировка с помощью компаратора
Если объекты в списке не реализуют интерфейс Comparable или если вы хотите отсортировать объекты в другом порядке, чем их реализация compare(), вам необходимо использовать реализацию Comparator(java.util.Comparator). Вот пример сортировки списка объектов Car с использованием Comparator.
Первый класс автомобилей:
public class Car{ public String brand; public String numberPlate; public int noOfDoors; public Car(String brand, String numberPlate, int noOfDoors) { this.brand = brand; this.numberPlate = numberPlate; this.noOfDoors = noOfDoors; } }
Вот код, который сортирует список вышеуказанных объектов Car:
List list = new ArrayList<>(); list.add(new Car("Volvo V40" , "XYZ 201845", 5)); list.add(new Car("Citroen C1", "ABC 164521", 4)); list.add(new Car("Dodge Ram" , "KLM 845990", 2)); Comparator carBrandComparator = new Comparator() { @Override public int compare(Car car1, Car car2) { return car1.brand.compareTo(car2.brand); } }; Collections.sort(list, carBrandComparator);
Также обратите внимание, что возможно реализовать Comparator, используя Lambda. Вот пример, который сортирует объекты List of Car с использованием трех различных лямбда-реализаций интерфейса Comparator, каждая из которых сравнивает экземпляры Car по своему полю:
List list = new ArrayList<>(); list.add(new Car("Volvo V40" , "XYZ 201845", 5)); list.add(new Car("Citroen C1", "ABC 164521", 4)); list.add(new Car("Dodge Ram" , "KLM 845990", 2)); Comparator carBrandComparatorLambda = (car1, car2) -> car1.brand.compareTo(car2.brand); Comparator carNumberPlatComparatorLambda = (car1, car2) -> car1.numberPlate.compareTo(car2.numberPlate); Comparator carNoOfDoorsComparatorLambda = (car1, car2) -> car1.noOfDoors - car2.noOfDoors; Collections.sort(list, carBrandComparatorLambda); Collections.sort(list, carNumberPlatComparatorLambda); Collections.sort(list, carNoOfDoorsComparatorLambda);
Фильтрация и сортировка данных
Вы можете ограничить количество элементов, отвечающих шаблону, введя фильтр — выражение, заключённое в квадратные
скобки и следующее непосредственно за оператором пути. Например, следующий образец указывает, что обрабатывать надо
только те элементы PRODUCT, у которых есть сорт серого цвета (элемент SORT имеет дочерний элемент COLOR, который
содержит текст «gray»):
<xsl:apply-templates select=»PRODUCTS/PRODUCT[SORT/COLOR=’gray’]» />
Следующий образец указывает, что обрабатывать надо только импортные товары (т.е. только те элементы PRODUCT, у
которых атрибут import равен «yes»:
<xsl:apply-templates select=»PRODUCTS/PRODUCT» />
Если в фильтр включено только имя элемента (без знака равенства и «контрольного» значения), проверяется только
наличие этого дочернего элемента. Если элемент имеет более одного дочернего элемента с именем, указанным в условии
фильтрации, проверяется только первый дочерний элемент.
Вы можете использовать атрибут order-by для сортировки данных XML при выводе. Вы можете назначить атрибуту order-by
один или несколько образцов, разделяя их точкой с запятой. Браузер будет сортировать элементы с использованием
образцов в том порядке, в котором они перечислены. Для указания направления сортировки (по возрастанию или убыванию)
следует предварять образец префиксом + или -. Например, вот так выглядит сортировка товаров по возрастанию по
признаку импорта, а для товаров с одинаковым признаком импорта — сортировка (по убыванию) по наименованию:
<xsl:apply-templates select=»PRODUCTS/PRODUCT» order-by=»+@import; -TITLE» />
Людоговский Александр
2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.
Важные элементы веб-браузера
Веб-браузеры — очень сложные части программного обеспечения с множеством движущихся частей, многие из которых не могут контролироваться или управляться веб-разработчиком с использованием JavaScript. Вы можете подумать, что такие ограничения — это плохо, но браузеры заблокированы по уважительным причинам (в основном ради безопасности). Представьте себе, что веб-сайт может получить доступ к вашим сохранённым паролям или другой конфиденциальной информации и войти на веб-сайты так, как если бы это были вы?
Несмотря на ограничения, Web API по-прежнему дают нам доступ к множеству функциональных возможностей, которые позволяют нам многое делать с веб-страницами. Есть несколько действительно очевидных моментов, на которые вы будете регулярно ссылаться в своём коде. Рассмотрим следующую диаграмму, которая представляет основные части браузера, непосредственно участвующие в просмотре веб-страниц:
- Окно — это вкладка браузера, в которую загружается веб-страница; это представлено в JavaScript объектом . Используя методы, доступные для этого объекта, вы можете делать такие вещи, как возврат размера окна (см. (en-US) и ), манипулировать документом, загруженным в этот window, хранить данные, специфичные для этого документа на стороне клиента (например, используя локальную базу данных или другой механизм хранения), присоединить обработчик событий () к текущему окну и многое другое.
- Навигатор представляет состояние и идентификатор браузера (т. е. пользовательский агент), как он существует в Интернете. В JavaScript это представлено объектом . Вы можете использовать этот объект для извлечения таких вещей, как геолокационная информация, предпочтительный язык пользователя, медиапоток с веб-камеры пользователя и т. д.
- Документ (представленный DOM в браузерах) представляет собой фактическую страницу, загруженную в окно, и представлен в JavaScript объектом . Вы можете использовать этот объект для возврата и обработки информации о HTML и CSS, содержащей документ, например, получить ссылку на элемент в DOM, изменить его текстовый контент, применить к нему новые стили, создать новые элементы и добавить их в текущий элемент как дочерний элемент, или даже вообще удалить его.
В этой статье мы сосредоточимся главным образом на манипулировании документом, но мы покажем ещё несколько полезных моментов.
Пример чтения и создания XML-файла
Для чтения готового XML-файла и формирования нового файла создадим в IDE Eclipse простой проект XMLSample,
структура которого представлена на следующем скриншоте.
Проект включает XML-файл «posts.xml» с исходными данными, создаваемый XML-файл данных «data.xml», класс
Post.java, в который будут упаковываться отдельные записи массива данных и основной класс проекта XMLSample,
который будет производить все необходимые действия.
Структура XML-файла
<?xml version="1.0" encoding="UTF-8"?> <ROOT xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <field name="forum_name">...</field> <field name="year_post">...</field> <field name="post_subject">...</field> <field name="MID(post_text, 1, 80)">...</field> <field name="username">...</field> <field name="post_time">...</field> <field name="post_time">...</field> <field name="post_subject_source">...</field> </row> </ROOT>
В качестве исходных данных используется XML-файл «posts.xml» из примеров разработчиков Sencha GXT 3.1.1.
Структура XML-данных содержит корневой элемент <ROOT> и набор объектов/сущностей, представленных тегами
<row />.
Листинг класса Person
import java.util.Date; public class Post { private static int ID = 0; private int id; private String username; private String subject; private String forum; private Date date; public Post() { setId(ID++); } }
Класс Person имеет несколько полей. Идентификатор записи id определяется при создании объекта в конструкторе.
Методы set/get не представлены в листинге.
Арифметические операторы javascript
Операторы предназначены для составления выражений.
Оператор применяется к одному или двум данным, которые в этом случае называются операндами.
Например, оператор сложения применяется к двум операндам (), а оператор логического отрицания — к одному операнду ().
Операторы присваивания:
- обычная операция присваивания;
у = 5; alert(y); // вывод 5 |
, присваивание со сложением или вычитанием;
у = 5; alert(y-=2); // вывод 3 |
, присваивание с умножением или делением.
у = 5; alert(y*=2); // вывод 10 |
Арифметические операторы:
- сложение в javascript:
X + Y; у = 5; х = у + 3; // равно 8 |
вычитание в javascript:
X - Y; |
умножение в javascript:
X * Y; |
деление в javascript:
X Y; |
возведение в степень в javascript:
X = 8; Y = 2; X ** Y; // 64 |
javascript остаток от деления или деление по модулю:
X = 8; Y = 5; X % Y; // 3 |
javascript инкремент или увеличение на 1:
Х = 8; Х++; // 9 /* Префиксный инкремент выполняется перед использованием переменной, пример:*/ let number = 100; ++number; // примет значение 101 /*Постфиксный инкремент выполняется после использования переменной, пример:*/ let number = 100; number++; // примет значение 100 alert(number); // выведет число 101 |
javascript декремент или уменьшение на 1:
Y=9; Y--; // 8 |
Задание Js 12. Какие значения выведет в окно браузера следующий фрагмент кода?
let str = "20"; let a = 5; document.write(str + a + "<br/>"); document.write(str - a + "<br/>"); document.write(str * "2" + "<br/>"); document.write(str 2 + "<br/>"); |
Имейте в виду, так как переменная является строковым типом, то переменная типа неявно преобразуется в строку и далее производится операция конкатенации. Но если операция сложения для строкового значения существует, то операции деления и вычитания для строк отсутствуют, соответственно, действия будут происходить с числами.
Js 13. Необходимо написать сценарий, определяющий площадь прямоугольного треугольника по заданным катетам (S = ab/2). Сценарий разместить в разделе документа. С помощью скрипта вывести в окно браузера инкремент площади.
Результат:
Площадь прямоугольного треугольника со сторонами 8 и 10 = 40 Инкремент площади = 41
Алгоритм решения задачи на javascript:
- Инициализация двух переменных.
- Вычисление площади.
- Вывод инкремента с использованием метода .
Здесь вы можете скачать заготовку кода файла со скриптом. Щелкните правой кнопкой -> Сохранить ссылку как.
Вопросы для самоконтроля:
- Что выполняют арифметические операции инкремент и декремент?
- Какова разница выполнения инкремента?:
Как обозначается операция остаток от деления?
XML SQL Utility for Java
Утилита XML SQL Utility for Java представляет собой набор классов Java, которые:
- передают SQL-запрос серверу баз данных и генерируют XML-документ, исходя из результирующего набора данных, возвращаемого по запросу (result set);
- записывают данные XML в соответствующие таблицы базы данных.
Рис. 5. Логика работы XML SQL Utility.
Листинг 10. Пример SQL-запроса.
6.1. Генерация XML-документов на основе результатов SQL-запроса
Как показано на рис. 5, XML SQL Utility обрабатывает SQL-запросы и возвращает результат в виде XML-документа.
Структура результирующего XML-документа опирается на внутреннюю структуру схемы базы данных, которая возвращает результат запроса. Колонки таблицы базы данных отображаются в элементы верхнего уровня. Скалярные значения отображаются в элементы с текстом. Объектные типы – в элементы с атрибутами, возникающими как подчиненные элементы. Коллекции отображаются в списки элементов. Ссылки на объекты и ограничения по ссылкам – в XML IDREFs.
Утилита может генерировать как текстовое представление XML-документа, так и представление структуры XML-документа в виде дерева. Последнее целесообразно использовать, если в дальнейшем планируется работать с XML-документом программно, например, трансформировать его в другие форматы с применением XSLT-процессора или использовать DOM API-методы для поиска в документе или для изменения его структуры.
Утилита также может быть использована для генерации DTD на основе схемы таблицы, к которой был обращен запрос.
Листинг 11. XML-документ, сгенерированный по SQL-запросу.
Листинг 12. Исходный запрос для примера 5.
Листинг 13. Код приложения, генерирующего XML-документ по SQL-запросу.
6.2. Пример 4: генерация XMLдокумента на базе результатов SQL-запроса
В листинге 10 приведен пример простого запроса на языке SQL. К нему применяется XML SQL Utility для создания документа. В результате генерируется XML-документ, представленный в листинге 11.
По умолчанию ROWSET есть имя корневого элемента. ROW есть имя элемента для каждой строки в результате, возвращаемом по запросу. Данные, такие как EMPNO, ENAME, также представлены как элементы, подчиненные элементу ROW.
Используя прикладной программный интерфейс рассматриваемой утилиты, можно также ограничивать данные, представленные в XML-документе. Например, можно определить максимальное число возвращаемых строк.
Листинг 14. Сгенерированный XML-документ для примера 5.
Приведенный в листинге 13 код на Java запрашивает базу данных и конструирует файл, содержащий результат. Исходным запросом является запрос, приведенный в листинге 12.
В результате работы приведенного в листинге 13 приложения будет сформирован XML-документ, представленный в листинге 14
Обратим внимание на то, что в документ помещены первые две строки, выбранные из таблицы EMP по запросу, приведенному в листинге 12
Листинг 15. Запись XML-данных в таблицу базы данных.
Рис. 6. Запись XML-данных в базу данных.
6.4. Запись XML-данных в таблицы базы данных
XML SQL Utility используется и для записи XML-данных в таблицы базы данных, причем в качестве сервера БД используется Oracle8i. Схема такой записи представлена на рис. 6.
Запись XML-документа в базу данных под управлением Oracle8i сохраняет структуру документа. Имена элементов преобразуются в имена столбцов таблицы. Элементы документа, содержащие только текст, преобразуются в скалярные столбцы, элементы, содержащие вложенные элементы, преобразуются в объектные типы. Списки элементов преобразуется в коллекции. Неструктурированные данные не могут быть преобразованы к хранимым в базах типам и должны быть сохранены как CLOB.
Целесообразно сопоставить запись XML-документа в базу данных и генерацию XML-документов на основе результатов SQL-запроса (см. выше тов на основе результатов SQL-запроса (см. выше одноименный раздел).
Рис. 7. Запись XML-данных в базу данных.
Листинг 16. Исходный XSQL-файл для примера 7.
Листинг 17. Стиль для примера 7 (продолжение на стр. 19).
Пример отображения XML-документа
Попробуем отобразить с помощью XSL-таблицы стилей следующий XML-документ, представляющий из себя некий абстрактный
упрощённый каталог товаров:
<?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href=Sample.xsl?> <!DOCTYPE PRODUCTS > <PRODUCTS> <PRODUCT import="yes"> <TITLE> Product #1 </TITLE> <SORT> <COLOR> red </COLOR> <PRICE> $10.00 </PRICE> </SORT> <SORT> <COLOR> blue </COLOR> <PRICE> $11.00 </PRICE> </SORT> <SORT> <COLOR> gray </COLOR> <PRICE> $16.00 </PRICE> </SORT> </PRODUCT> <PRODUCT> <TITLE> Product #2 </TITLE> <SORT> <COLOR> red </COLOR> <PRICE> $20.00 </PRICE> </SORT> <SORT> <COLOR> green </COLOR> <PRICE> $22.00 </PRICE> </SORT> </PRODUCT> <PRODUCT import="yes"> <TITLE> Product #3 </TITLE> <SORT> <COLOR> red </COLOR> <PRICE> $30.00 </PRICE> </SORT> <SORT> <COLOR> blue </COLOR> <PRICE> $33.00 </PRICE> </SORT> </PRODUCT> <PRODUCT> <TITLE> Product #4 </TITLE> <SORT> <COLOR> red </COLOR> <PRICE> $40.00 </PRICE> </SORT> <SORT> <COLOR> blue </COLOR> <PRICE> $44.00 </PRICE> </SORT> </PRODUCT> <PRODUCT> <TITLE> Product #5 </TITLE> <SORT> <COLOR> red </COLOR> <PRICE> $50.00 </PRICE> </SORT> <SORT> <COLOR> gray </COLOR> <PRICE> $55.00 </PRICE> </SORT> </PRODUCT> </PRODUCTS>
XSL-таблица стилей (файл Sample.xsl) для отображения приведённого выше XML-документа может выглядеть следующим
образом:
<?xml version="1.0" encoding="windows-1251"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <H1>Каталог товаров</H1> <xsl:apply-templates select="PRODUCTS/PRODUCT" /> </xsl:template> <xsl:template match="PRODUCT"> <SPAN style="font-style:italic">Наименование:</SPAN> <xsl:value-of select="TITLE" /> <BR /> <SPAN style="font-style:italic">Импортный:</SPAN> <xsl:value-of select="@import" /> <BR /> <TABLE border="1" width="100%" cellspacing="0"> <xsl:apply-templates select="SORT" /> </TABLE> <BR /> </xsl:template> <xsl:template match="SORT"> <TR> <TD><xsl:value-of select="COLOR" /></TD> <TD><xsl:value-of select="PRICE" /></TD> </TR> </xsl:template> </xsl:stylesheet>