Автор: Ма Сяонин
XML (Extensible Markup Language) может выглядеть как какой-то стандарт w3c — сейчас он не имеет практического значения, а даже если и пригодится в будущем, то это будет много времени спустя. Но на самом деле оно уже используется. Поэтому не ждите, пока XML будет добавлен в ваш любимый HTML-редактор, чтобы начать его использовать. Теперь он может решать различные внутренние проблемы и проблемы системы b2b.
В Sparks.com мы используем XML для стандартизации представления данных в различных системах, от объектов Java до отображения данных в формате HTML.
В частности, мы обнаружили, что данными можно легче обмениваться и манипулировать ими, если они стандартизированы в очень простой структуре XML. В ходе этого процесса мы обнаружили множество эффективных способов использования XML. Ниже подробно описывается наше текущее приложение.
Стандартизация. Прежде чем использовать XML, создайте формат данных XML, который отличается от информации, которую вы хотите использовать.
Создать динамический XML
Генерация HTML из базы данных не является чем-то новым, но генерация XML — новинкой. Здесь мы представляем конкретные этапы генерации.
Использование xsl в качестве языка шаблонов
XSL (расширяемый язык таблиц стилей) — хороший способ определить формат отображения данных XML, и он будет более эффективен, если будет написан в виде нескольких статических шаблонов.
Создать HTML
xml плюс xsl равняется HTML. Возможно, это звучит неправильно, но наша HTML-страница, которую видят пользователи, на самом деле является результатом xml и xsl.
1.
Возможность стандартизации XML обусловлена его гибкостью. Но, к сожалению, иногда он настолько гибок, что у вас остается пустая страница в размышлениях о том, как решить проблему.
В любом проекте XML первым шагом является создание стандартного формата данных. Для этого вам нужно будет принять следующие решения:
• Какие данные будут задействованы?
• Использовать ли dtd (определение типа файла)
• Хотите ли вы использовать DOM (объектную модель документа) или SAX (упрощенный API для XML) для анализа
и определения данных:
Поскольку стандартного формата XML не существует, разработчики могут разрабатывать свои собственные форматы. Однако если ваш формат распознается только одним приложением, вы можете запустить только это приложение, чтобы использовать этот формат. Очевидно, было бы полезнее, если бы существовали другие программы, которые также могли бы читать ваш формат xml. Если формат XML изменен, возможно, потребуется изменить и использующую его систему, поэтому вам следует создать формат как можно более полным. Поскольку большинство систем игнорируют теги, которые они не распознают, самый безопасный способ изменить формат XML — добавить теги, а не изменять их.
Нажмите здесь, чтобы просмотреть пример формата данных XML
. На сайте sparks.com мы рассмотрели все данные о продукте, необходимые для различных презентаций продукта. Хотя не все страницы используют все данные, мы разработали очень полный формат данных XML, подходящий для всех данных. Например, на странице сведений о продукте отображается больше данных, чем на странице просмотра продуктов. Однако в обоих случаях мы по-прежнему используем один и тот же формат данных, поскольку шаблон xsl каждой страницы использует только те поля, которые ему необходимы.
Использовать ли dtd
На сайте sparks.com мы используем хорошо организованный XML, а не просто правильный XML, поскольку первый не требует dtd. DTD добавляет уровень обработки между щелчком пользователя и просмотром страницы. Мы обнаружили, что этот слой требует слишком много обработки. Конечно, по-прежнему приятно использовать DTD при общении с другими компаниями в формате XML. Потому что dtd может гарантировать правильность структуры данных при отправке и получении.
Выбор механизма синтаксического анализа Теперь можно использовать несколько механизмов синтаксического анализа. Какой из них вы выберете, почти полностью зависит от потребностей вашего приложения. Если вы решите использовать DTD, то механизм синтаксического анализа должен иметь возможность проверять ваш XML с помощью DTD. Вы могли бы выделить проверку в отдельный процесс, но это повлияет на производительность.
Sax и dom — две основные модели синтаксического анализа. SAX основан на событиях, поэтому при анализе XML события отправляются в механизм. Далее события синхронизируются с выходным файлом. Механизм анализа DOM устанавливает иерархическую древовидную структуру для динамических данных XML и таблиц стилей XSL. Путем случайного доступа к дереву DOM данные XML могут быть предоставлены так, как если бы они были определены таблицей стилей XSL. Дебаты по модели SAX в основном сосредоточены на чрезмерном уменьшении памяти структуры DOM и ускорении времени анализа таблицы стилей XSL.
Однако мы обнаружили, что многие системы, использующие sax, не используют его в полной мере. Эти системы используют его для построения структур DOM и отправки событий через структуры DOM. При таком подходе DOM необходимо создавать из таблицы стилей перед любой обработкой XML, поэтому производительность снизится.
2. Создание динамического XML-файла.
После того, как формат XML установлен, нам нужен метод для его динамического переноса из базы данных.
Генерация XML-документов относительно проста, поскольку для этого требуется только система, способная обрабатывать строки. Мы построили систему с использованием Java-сервлета, корпоративного Javabean-сервера, jdbc и rdbms (системы управления реляционными базами данных).
• Сервлет обрабатывает запросы информации о продукте, перекладывая задачу создания XML-документов на корпоративный JavaBean (ejb).
• ejb использует jdbc для запроса необходимой информации о продукте из базы данных.
• ejb генерирует XML-файл и передает его сервлету.
Сервлет вызывает механизм синтаксического анализа для создания выходных данных в формате HTML из файлов XML и статических таблиц стилей XSL.
(Дополнительную информацию о применении XSL см. в разделе «Использование XSL в качестве языка шаблонов».)
Пример генерации XML Фактический код для создания строки документа XML в Java можно разделить на несколько методов и классов.
Код, запускающий процесс генерации XML, помещается в метод ejb. Этот экземпляр немедленно создаст строковый буфер для хранения сгенерированной строки XML.
stringbuffer xml = новый stringbuffer();
xml.append(xmlutils.begindocument("/browse_find/browse.xsl", "browse", request));
xml.append(product.toxml());
xml.append(xmlutils.enddocument("обзор");
out.print(xml.tostring());
Следующие три переменные xml.append() сами по себе являются вызовами других методов.
Создание заголовка файла. Первый дополнительный метод вызывает класс xmlutils для создания заголовка файла xml. Код в нашем Java-сервлете выглядит следующим образом:
public static string Begindocument (таблица стилей строки, страница строки)
{
stringbuffer xml = новый stringbuffer();
xml.append("<?xml version="1.0"?>n")
.append("<?xml-таблица стилей href="")
.append(таблица стилей).append(""")
.append(" type ="text/xsl"?>n");
xml.append("<").append(page).append(">n");
вернуть xml.tostring();
}
Этот код генерирует заголовок XML-файла. Тег <?xml> определяет этот файл как XML-файл, поддерживающий версию 1.0. Вторая строка кода указывает на расположение правильной таблицы стилей для отображения данных. Последнее, что включено, — это тег уровня элемента (в этом примере <browse>). В конце файла необходимо закрыть только тег <browse>.
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
После заполнения информации о продукте и заполнения заголовка файла метод управления вызовет объект Java для создания его XML. В этом примере вызывается объект продукта. Объект продукта использует два метода для создания своего XML-представления. Первый метод toxml() создает узел продукта, генерируя теги <product> и </product>. Затем он вызывает метод Internalxml(), который предоставляет необходимое содержимое для XML-файла продукта. Internalxml() — это серия вызовов stringbuffer.append(). Строковый буфер также преобразуется в строку и возвращается методу управления.
общедоступная строка toxml()
{
stringbuffer xml = новый stringbuffer("<продукт>n");
xml.append(internalxml());
xml.append("</product>n");
вернуть xml.tostring();
}
публичная строка Internalxml()
{
строковый буфер xml = новый
строковыйбуфер("t")
.append(тип продукта).append("n");
xml.append("t").append(idvalue.trim())
.append("n");
xml.append("t").append(idname.trim())
.append("n");
xml.append("t").append(page.trim())
.append("n");
Панг?
xml.append("t").append(количество).append("n");
xml.append("t").append(поставщик).append("n");
xml.append("tn");
xml.append("t").append(pubdesc).append("n");
xml.append("t").append(vendesc).append("n";
Панг?
вернуть xml.tostring();
}
Наконец, метод xmlutils.enddocument() вызывается после закрытия файла. Этот вызов закрывает тег xml (в данном случае) и, наконец, завершает структурированный XML-файл. Весь строковый буфер из метода управления также преобразуется в строку и возвращается сервлету, который обрабатывал исходный HTTP-запрос.
3. Используйте xsl в качестве языка шаблонов
. Чтобы получить вывод в формате HTML, мы объединяем сгенерированный файл xml с шаблоном xsl, который управляет представлением данных xml. Наши шаблоны xsl состоят из тщательно организованных тегов xsl и html.
Начало создания шаблона Начало нашего шаблона xsl похоже на код ниже. Первая строка кода является обязательной и определяет этот файл как таблицу стилей xsl. Атрибут xmlns:xsl= относится к пространству имен xml, используемому этим файлом, а атрибут version= определяет номер версии пространства имен. В конце файла закрываем тег.
Вторая строка кода, начинающаяся с <xsl:template>, определяет режим шаблона xsl. Атрибут match является обязательным и указывает на тег xml <basketpage>. В нашей системе тег <basketpage> содержит тег <product>, который позволяет шаблону xsl получать доступ к информации о продукте, встроенной в тег <product>. Нам снова нужно закрыть тег <xsl:template> в конце файла.
Далее давайте посмотрим на хорошо организованный HTML. Поскольку он будет обрабатываться механизмом синтаксического анализа XML, он должен соответствовать всем правилам хорошо организованного XML. По сути, это означает, что все открывающие теги должны иметь соответствующий закрывающий тег. Например, тег <p>, который обычно не закрывается, должен закрываться с помощью </p>.
<xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/xsl/transform "
версия="1.0">
<xsl:template match="basketpage">
<html>
<голова>
<title>сумка для покупок / регулировка количества</title>
</голова>
<body bgcolor="#cccc99" bgproperties="fixed" link="#990000" vlink="#990000">
<br>
?br> </xsl:template>
</xsl:таблица стилей>
В теле шаблона имеется множество тегов xsl, используемых для обеспечения логики представления данных. Ниже описаны два часто используемых тега.
выбирать
Тег <xsl:choose> аналогичен началу структуры if-then-else в традиционных языках программирования. В XSL тег выбора указывает, что в той части, где вводится код, назначение вызовет действие. Тег <xsl:when> с назначенными атрибутами следует за тегом выбора. Если присвоение правильное, будет использовано содержимое между открывающим и закрывающим тегами <xsl:when>. Если присвоение неверно, используется содержимое между открывающим и закрывающим тегами <xsl:otherwise>. Весь раздел заканчивается </xsl:choose>.
В этом примере тег When проверяет XML-файл на наличие тега количества. Если тег количества содержит атрибут ошибки со значением true, в теге количества будут отображаться ячейки таблицы, перечисленные ниже. Если значение атрибута неверно, xsl отобразит содержимое между другими тегами. В приведенном ниже примере, если атрибут ошибки не имеет значения true, ничего отображаться не будет.
<xsl:выбрать>
<xsl:when test="quantity[@error='true']">
<td bgcolor="#ffffff"><img height="1" width="1" src="