Язык xml использование java xml обработчиков


Содержание

Java XML

J ava Development Kit поставляется с двумя парсерами XML: DOM и SAX, каждый из которых имеет свои сильные и слабые стороны. В этом руководстве мы рассмотрим несколько примеров создания, изменения и чтения XML файлов средствами библиотек DOM, SAX и JDOM.

Кроме этого, будут рассмотрены примеры использования библиотеки JAXB для преобразования Java объектов в XML файлы и обратно.

DOM XML парсер

DOM XML парсер — наиболее простой способ работы с XML файлами в Java. При работе с XML файлами производится разбор всего файла, строится его объектная модель, которая полностью загружается в память. Для каждого XML элемента создается свой объект, между которыми организуется удобный способ навигации. DOM XML парсер не рекомендуется использоваться при работе с XML файлами большого размера: с такими файлами работа происходит очень медленно и расходуется очень большое количество памяти.

  • Чтение XML файла средствами DOM XML
    Прочитать XML файл и распечатать каждый из его элементов.
  • Внесение изменений в XML файл средствами DOM XML
    Внесение изменений в существующий XML файл: изменить XML элемент, изменить значения атрибутов, добавить и удалить XML элемент.
  • Создание XML файла средствами DOM XML
    Создать новый XML файл, в котором определены новый документ, XML элементы и добавлены атрибуты.
  • Подсчет XML элементов в файле средствами DOM XML
    Отыскать все XML элементы в файле и подсчитать их количество.

SAX XML парсер

SAX XML парсер работает не так, как DOM: он не читает весь XML файл целиком, не загружает его в память и не создает объекты для каждого элемента. Вместо этого, SAX парсер использует функцию обратного вызова (callback function) org.xml.sax.helpers.DefaultHandler , с помощью которой информирует клиента об изменении структуры XML документа.

Техника работы станет более понятно после рассмотрения конкретных примеров использования SAX XML парсера.

  • Чтение XML файла средствами SAX XML
    Прочитать XML файл с помощью SAX функции обратного вызова.

JDOM XML парсер

Библиотека JDOM XML позволяет представить XML документ в простой и понятной форме, удобной для чтения и изменения данных. JDOM XML является полноценной альтернативой SAX и DOM.

  • Чтение XML файла средствами JDOM XML
    Прочитать XML файл с помощью JDOM и распечатать каждый из элементов.
  • Внесение изменений в существующий XML файл средствами JDOM XML
    Внесение изменений в существующий XML файл: изменить XML элемент, изменить значения атрибутов, добавить и удалить XML элемент.
  • Создание XML файла средствами JDOM XML
    Создать новый XML файл, в котором определены новый документ, XML элементы и добавлены атрибуты.

Использование JAXB аннотаций для преобразования Java объектов в XML и обратно.

Введение в язык XML

Много лет назад Билл Брогден присутствовал на конференции, посвященной обработке данных об окружающей среде. Одной из целей конференции было обсуждение серьезных проблем, возникающих при обмене данными между учеными, особенно проживающими в разных странах. При попытке согласовать данные, поступившие из различных источников, любому исследователю приходилось иметь дело с различными форматами хранения данных, всевозможными способами записи и типами компьютеров — это выглядело как строительство Вавилонской башни.

Конференцию открыл один из заведующих кафедры экологии (имевший гуманитарное образование). Он начал свое выступление с того, что описал глубокое изумление, которое он испытал, узнав, что на магнитной ленте с данными научно-технического характера отсутствует встроенное описание этих данных. Без подробной информации, полученной из отдельного источника, такая лента становится совершенно бесполезной. Остальные участники конференции согласились, что эта ситуация неудовлетворительна, но никто не знал, как исправить положение.

Теперь, с появлением языка XML, наконец реализовалась идея о том, что любые данные должны сопровождаться собственным описанием. Широкое распространение, которое получил расширяемый язык разметки (Extensible Markup Language, XML) за время, прошедшее с 1998 года, когда первый стандарт XML был опубликован консорциумом W3C (World Wide Web Consortium), служит подтверждением того, что многие отрасли науки и промышленности созрели для серьезных изменений в области описания данных.

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

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

Оказалось, что подобная гибкость — как раз то, что требуется для многих практических приложений. Компании, которые обмениваются информацией с другими компаниями через Интернет, все чаще и чаще отказываются от стандарта EDI (Electronic Data Interchange — электронный обмен данными) в пользу XML. Предполагается, что эти так называемые В2В (Business-to-business — бизнес для бизнеса) приложения содержат наибольшее количество данных в формате XML во всем Интернете.

В настоящее время имеется большое количество сайтов, которые представляют интерес для пользователей Java и XML. Прекрасным местом для начала поиска новостей и справочных материалов является сайт oasis.oasis-open.org, который принадлежит организации по продвижению стандартов структурирования информации. Эта самая большая в мире независимая некоммерческая организация, занимающаяся стандартизацией приложений XML.

Если вы интересуетесь Java, вам наверняка приходится часто слышать и о XML, так как с самого начала язык Java был тесно связан с XML. Джон Босак (Jon Bosak), один из первых инициаторов стандартизации XML, работает в компании Sun, и большая часть работы по созданию анализаторов XML на первом этапе была сделана с помощью Java.

Так или иначе, интерес к XML распространился всюду в компьютерной промышленности, от огромных корпораций, таких как IBM и Microsoft, до неформальных рабочих групп на всех уровнях. Силами отдельных программистов и небольших групп сделаны многие существенные усовершенствования XML. Например, неформальной группе «XML Devian », организовавшейся на основе списка рассылки в Интернете, принадлежит заслуга создания упрощенного интерфейса API для XML, известного как SAX. Разработка этого проекта исходно велась на языке Java.

В нашем курсе мы будем использовать сервлеты [Так, по-видимому, по аналогии с апплетами авторы называют программы, написанные на языке Java и выполняющиеся на сервере — Примеч ред. ] Java и JSP-страницы (JavaServer Pages) для создания web-приложений, работающих с данными XML. Сервлеты выполняются на web-сервере, осуществляя те функции, которые ранее возлагались на сценарии CGI. JSP-страницы позволяют объединять элементы разметки HTML и фрагменты кода Java. Технология сервлетов и JSP-страниц развивается примерно так же быстро, как язык XML.

Во время написания этого курса текущей версией API для сервлетов Java была версия 2.2, выпущенная в декабре 1999 года. Этот интерфейс API содержит много изменении по сравнению с предыдущей версией, особенно в области создания web-приложений и стандартизованной настройки приложения на базе XML.

Стандартизация технологии JavaServcr Pages происходила гораздо медленнее. Развитие интерфейса API надолго затормозилось на версии 0.92. Отсутствие ясных указаний со стороны Sun привело к тому, что многие компании по созданию программного обеспечения разработали свои собственные технологии для объединения пользовательских тегов в HTML с возможностью поиска по базе данных и другими аналогичными возможностями.

Когда компания Sun разработала редакцию Java, которая впоследствии стала называться Java 2 Enterprise Edition (редакция Java 2 для корпоративных программных систем на базе Java), стало ясно, что технология JSP будет играть значительную роль в общей концепции создания web-приложений. Поэтому дальнейшее развитие API для JSP-страниц пошло быстрее, появились версии 1.0 и 1.1. Когда была опубликована редакция J2EE, стало ясно, что сервлеты Java и JSP-страницы уже в значительной степени интегрированы в общую картину развития web-приложений на Java. Другой важной особенностью J2EE явилось использование XML для описания web-приложений.

Наиболее значительное в этой области событие произошло в октябре 1999 года. Компания Sun передала организации Apache весь исходный код API 2.2 для сер- влетов и API 1.1 для JSP-страниц с целью дальнейшей разработки открытых эталонных реализаций контейнеров сервлетов Java и JSP-страниц. Эта разработка не зависит от J2EE и гарантирует постоянное наличие в свободном доступе новейших реализаций интерфейсов API для сервлетов и JSP-страниц.

Мы предполагаем, что вы на базовом уровне знакомы с HTML, Java и web-серверами и у вас имеется доступ к компьютеру, на котором можно установить небольшой web-сервер, стандартный компилятор Java и другие служебные программы. Редактировать данные XML можно с помощью любого текстового редактора, либо вы можете использовать один из многочисленных коммерческих или находящихся в свободном доступе специализированных редакторов XML.

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

Для многих проектов мы использовали находящийся в свободном доступе небольшой web-сервер —Jakarta-Tomcat (http://jakarta.apache.org), содержащий комплект необходимых разработчику инструментальных средств. Если у вас еще нет web-сервера, то для начала Tomcat является хорошим вариантом. Также мы использовали сервер JRun (www.allaire.com) — как в автономном режиме, так и в качестве дополнения к web-серверам Microsoft PWS и IIS. Еще вы можете испытать сервер Orion (www.orionserver.com), в который включено хорошее учебное пособие по библиотеке тегов JSP.

Служебные программы и комплекты инструментальных средств для работы с XML, написанные на Java, появляются как грибы после дождя. Для того чтобы придерживаться определенных стандартов, мы использовали версию JAXP 1.0 (Java API for XML parsing — интерфейс API Java для анализа документов XML). Этот пакет можно загрузить с web-сайта java.sun.com. Следующая версия пакета JAXP во время создания этого курса проходила стадию бета-тестирования, так что к моменту выхода курса он, вероятно, уже будет доступен.

Цель этого курса — познакомить разработчиков с технологиями использования XML в программах на Java. Вместо того чтобы рассказывать о теоретической стороне дела, мы сразу переходим к практическому применению этих технологий на примере построения коммерческого web-сайта.

Лекция 1. В этой лекции вы найдете введение в XML с объяснениями всех каверзных моментов этого языка и типичных способов его использования. Также в этой лецции приводится обзор двух моделей обработки данных XML с помощью Java — DOM и SAX.

Лекция 2. Эта лекция посвящена решению вопросов, возникающих при разработке каталога товаров на XML. Этот язык является настолько гибким, что иногда бывает непросто выбрать один из многих способов представления данных. Выбранная структура каталога иллюстрирует многие важные задачи, которые вам придется решать при разработке собственного проекта подобного рода. Построенный нами каталог, который дорабатывается в следующих лекциях, включает описания более сотни наименований товаров.

Лекция 3. Эта лекция начинается с обзора интерфейсов API для сервлетов Java и JSP-страниц, используемых для создания динамических web-страниц Затем мы рассматриваем стандартные интерфейсы API Java для извлечения данных из документов XML, после чего мы объединяем все эти функции в сервлете Java, предназначенном для получения информации из каталога и отображения ее в формате HTML. В числе прочих этот сервлет реализует возможность поиска товаров по ключевым словам.

Лекция 4. В этой лекции мы расширяем классы для представления каталога из лекции 3 и создаем действующую корзину покупателя, которая позволяет покупателю заказывать товары через Интернет. В процессе создания этого приложения мы рассказываем о том, как концепция мониторинга сеанса реализована в сервлетах Java .

Лекция 5. Теперь, когда у нас имеется корзина покупателя, нам нужно обеспечить возможность получения денег от клиента и оформления заказа (разумеется, с использованием XML). В нашем примере для представления соответствующей информации клиенту используется технология JavaServer Pages.

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

Лекция 7. Насущной потребностью для любого коммерческого сайта является способность собирать информацию о своих клиентах. В этой лекции приводится основанная на XML система опроса, в которой предусмотрена возможность ветвления (возможность задавать различные вопросы различным пользователям в зависимости от их ответов на определенные специальные вопросы). Возникающая задача анализа собранных результатов дает нам возможность продемонстрировать, как с помощью интерфейса SAX обрабатывать большие документы XML.

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

Лекция 9. В наши дни многие коммерческие сайты включают в свои домашние страницы заголовки новостей, пытаясь тем самым заинтересовать пользователей и стимулировать их к частому посещению сайта. Как показано в этой лекции, вы можете обеспечить присутствие на вашем сайте текущих новостей буквально по сотням тематических категорий, и для этого не нужен целый штат репортеров — всего лишь XML и Java.

Лекция 10. В предыдущих лекциях рассказывается о деталях организации ресурсов для web-приложения на Java. В этой лекции мы приводим обзор спецификации Sun для версии API 2.2 сервлетов Java и обсуждаем интерфейсы для Java и XML следующего поколения.

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

Исходный код для всех этих программ вы найдете в каталоге http://bourabai.kz/xml/cod/, в папках, названия которых соответствуют нумерации лекций. Поскольку подготовка каталога относится к тем видам работы над курсом, которые заканчиваются в последнюю очередь, файлы в каталоге могут содержать исправления или добавления, отсутствующие в листингах, включенных в текст курса.

Мы старались придерживаться максимально простого способа организации материала. Соглашения об обозначениях в этом курсе знакомы всем читателям. Для фрагментов кода и текстов программ используется моноширинный шрифт, пример которого вы видите в следующем объявлении метода:

Мы иногда будем использовать эту врезку для того, чтобы вставить какое-либо замечание, выходящее за рамки рассматриваемого в основном тексте вопроса.

Эту врезку мы используем для того, чтобы обратить ваше внимание на возможные сложности, например отклонение от стандарта.

Здесь вы найдете советы тех, кто действительно знает решение.

Релятивисты и позитивисты утверждают, что «мысленный эксперимент» весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.

Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: «Если факт не соответствует теории — измените факт» (В другом варианте » — Факт не соответствует теории? — Тем хуже для факта»).

Максимально, на что может претендовать «мысленный эксперимент» — это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.

Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.

Понятие «мысленный эксперимент» придумано специально спекулянтами — релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим «честным словом». Подробнее читайте в FAQ по эфирной физике.

НОВОСТИ ФОРУМА
Рыцари теории эфира
01.10.2020 — 05:20: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]69vJGqDENq4[/Youtube][/center]
[center]14:36[/center]
Osievskii Global News
29 сент. Отправлено 05:20, 01.10.2020 г.’ target=_top>Просвещение от Вячеслава Осиевского — Карим_Хайдаров.
30.09.2020 — 12:51: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Ok]376309070[/Ok][/center]
[center]11:03[/center] Отправлено 12:51, 30.09.2020 г.’ target=_top>Просвещение от Дэйвида Дюка — Карим_Хайдаров.
30.09.2020 — 11:53: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ — Upbringing, Inlightening, Education ->
[center][Youtube]VVQv1EzDTtY[/Youtube][/center]
[center]10:43[/center]

интервью Раввина Борода https://cursorinfo.co.il/all-news/rav.
мой телеграмм https://t.me/peshekhonovandrei
мой твиттер https://twitter.com/Andrey54708595
мой инстаграм https://www.instagram.com/andreipeshekhonow/

[b]Мой комментарий:
Андрей спрашивает: Краснодарская синагога — это что, военный объект?
— Да, военный, потому что имеет разрешение от Росатома на манипуляции с радиоактивными веществами, а также иными веществами, опасными в отношении массового поражения. Именно это было выявлено группой краснодарцев во главе с Мариной Мелиховой.

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

[center][Youtube]CLegyQkMkyw[/Youtube][/center]
[center]10:22 [/center]

Доминико Риккарди: Россию ждёт страшное будущее (хотелки ЦРУ):
https://tainy.net/22686-predskazaniya-dominika-rikardi-o-budushhem-rossii-sdelannye-v-2000-godu.html

Завещание Алена Даллеса / Разработка ЦРУ (запрещено к ознакомлению Роскомнадзором = Жид-над-рус-надзором)
http://av-inf.blogspot.com/2013/12/dalles.html

[center][b]Сон разума народа России [/center]

Работа с XML в Java

В этой теме 0 ответов, 1 участник, последнее обновление Васильев Владимир Сергеевич 1 год назад.

Java полностью реализует интерфейсы XML DOM 3.
Ниже приведен пример загрузки demo.xml. Обратите внимание на импорт, имена как Document и Element присутствуют в различных пакетах.

В качестве demo.xml можно взять любой xml файл, или написать свой, например,

класс DocumentBuilderFactory

Данный класс позволяет получить парсер, порождающий дерево DOM 3 объектов xml документа.

  • newInstance() — статический метод возвращающий экземпляр класса DocumentBuilderFactory;
  • newInstance(String factoryClassName, ClassLoader classLoader) — статический метод возвращающий
    экземпляр класса DocumentBuilderFactory;
  • newDocumentBuilder() — создает объект DocumentBuilder (xml парсер) с учетом текущей конфигурации;
  • setSchema(Schema schema) — установить схему (объект Schema), которая будет использоваться созданными парсерами;
  • getSchema() — получить установленную схему;
  • setCoalescing(boolean coalescing) — устанавливает, будут ли парсеры конвертировать CDATA узлы
    в Text узлы и добавлять их текстовым узлам;
  • isCoalescing() — определяет, будут ли парсеры конвертировать CDATA узлы в Text
    узлы и добавлять их текстовым узлам;
  • setIgnoringComments(boolean igComm) — устанавливает, будут ли парсеры игнорировать комментарии;
  • isIgnoringComments() — определяет, будут ли парсеры игнорировать комментарии;
  • setExpandEntityReferences(boolean arg) — устанавливает, будут ли
    парсеры раскрывать xml сущности;
  • isExpandEntityReferences() — определяет, будут ли парсеры
    раскрывать xml сущности;
  • setIgnoringElementContentWhitespace(boolean ws) — устанавливает, будут ли
    парсеры устранять пробельные символы из содержимого элемента;
  • isIgnoringElementContentWhitespace() — определяет, будут ли парсеры
    устранять пробельные символы из содержимого элемента;
  • setNamespaceAware(boolean a) — устанавливает, будут ли парсеры понимать пространства имен xml;
  • isNamespaceAware() — определяет, будут ли парсеры понимать пространства имен xml;
  • setXIncludeAware(boolean state) — устанавливает, будут ли парсеры понимать
    xml вставки по спецификации XML Inclusions (XInclude) Version 1.0;
  • isXIncludeAware() — определяет, будут ли парсеры понимать xml
    вставки по спецификации XML Inclusions (XInclude) Version 1.0;
  • setFeature(String name, boolean value) — устанавливает состояние указанной характеристики, которая указывается как полноценный URI;
  • getFeature(String name) — определяет состояние именованной характеристики;
  • setValidating(boolean v) — устанавливает, будут ли парсеры проверять разобранный документ на валидность;
  • isValidating() — определяет, будут ли парсеры праверять разобранный документ на валидность.

DocumentBuilder

Разбирает xml документ и создает соответствующий DOM Document.

  • getSchema() — получить используемую схема (объект Schema);
  • isNamespaceAware() — определяет, понимает ли парсер пространства имен;
  • isValidating() — определяет, проверяет ли парсер документ на валидность;
  • isXIncludeAware() — определяет, понимает ли парсер xml вставки;
  • newDocument() — создает пустой документ;
  • parse(File f) — создает документ по указанному xml файлу;
  • parse(String uri) — создает документ по содержимому указанного URI;
  • reset() — сбросить настройки DocumentBuilder в первоначальные значения;
  • setEntityResolver(EntityResolver er) — указать объект, который
    будет разрешать найденные xml сущности;
  • setErrorHandler(ErrorHandler eh) — установить обработчик ошибок.

SAX 2.0 (Simple API for XML)

В Java уже реализована SAX обертка, позволяющая читать xml файлы любым SAX-совместимым парсером, например, парсер Apache Xerces. Если ссылка изменилась поищите его в xml проектах.

Ниже приведен пример использования Apache Xerces с помощью SAX обертки. Для выполнения примера не забудьте подключить библиотеки парсера.

ContentHandler

Интерфейс обработки событий разбора xml документа SAX парсерами. Класс DefaultHandler2 реализует данный интерфейс по умолчанию.

  • startDocument() — начало документа;
  • startElement(String uri, String localName, String qName, Attributes atts) — начало элемента;
  • characters(char[] ch, int start, int length) — прочитаны символьные данные;
  • ignorableWhitespace(char[] ch, int start, int length) — пробельные символы в содержании элемента;
  • processingInstruction(String target, String data) — инструкции для процессора;
  • skippedEntity(String name) — пропущенная xml сущность;
  • startPrefixMapping(String prefix, String uri) — начало видимости отображения пространства имен по URI префиксу;
  • endPrefixMapping(String prefix) — конец видимости URI префикса;
  • endElement(String uri, String localName, String qName) — конец элемента;
  • endDocument() — конец документа.

Примеры

1. Поиск нужных элементов.

Метод Element.getElementsByTagName возвращает список всех подэлементов с указаным именем.

Всех значит прямо всех, не только непосредственных «детей» этого элементов, но и «внуков» (детей их детей) и «правнуков» и т.д.
Другими словами, если у нас есть следующий XML:

Тогда при его обработке:

Вернутся элемент «one» и элемент «two».
Это очень неоптимальный способ обработки XML.

2. Безопасный парсинг.

Предположим вы принимаете в качестве запроса XML-файлики вида:

Если злоумышленник отправит вам вместо этого:

Тогда содержимым элемента «message» будет список файлов с вашего диска С (ничто не мешает указать не директорию, а запросить содержимое файла, например: SYSTEM «file:///etc/password» ).

Это возможно например в случае если код обработки XML-ки выглядит приблизительно следующим образом:

Это не очень приятно, т.к. гипотетически возможны следующие сценарии дальнейшего развития события:
1. Ваш серверный код умный, и тогда вернет ошибку некорректное значение такое-то:»содержимое файла» и злоумышленник получит результат сразу.
2. Ваш код не делает никаких проверок, сохраняет запись. Тогда злоумышленник получит данные потом, запросив содержимое документа.

Самое главное, что это не какая-то ошибка, а вполне законная работа API, которая так и должна работать (по крайней мере в Java 7). Такой способ взлома уже используется наверное больше десяти лет, но программисты продолжают его игнорировать.

Для того, чтобы обезопасится, нужно предпринять некоторые усилия — указать дополнительные настройки XML-парсера, ограничить права доступа и т.д. Какие конкретно настройки указывать можно найти с помощью поисковика по запросу «XML External Entity» или посмотреть на сайте OWASP.

Понимание XML

Узнайте, как Расширяемый язык разметки (Extensible Markup Language — XML) облегчает универсальный доступ к данным. XML — основанный на Unicode метаязык: язык для описания языков разметки. Он не привязан ни к одному языку программирования, операционной системе или поставщику программного обеспечения. XML обеспечивает доступ к огромному количеству технологий по манипулированию, структурированию, трансформированию и запрашиванию данных.

Введение

Расширяемый язык разметки (XML) изначально был задуман как язык для описания новых форматов документов World W >‘ ’ ). Web-разработчики могут заметить некоторую схожесть между HTML и XML, обусловленную тем фактом, что они оба происходят от SGML.

Поскольку применение XML возросло, сейчас общепринято считать, что XML полезен не только при описании новых форматов документов для Web, но также подходит для описания структурированных данных. Примеры структурированных данных включают информацию, которая обычно содержится в крупноформатных таблицах, файлах конфигурации программы и сетевых протоколах.

XML является предпочтительным для существовавших ранее форматов данных, потому что XML может запросто представить и табличные данные (такие как реляционные данные из базы данных или больших таблиц), и псевдоструктурированные данные (такие как Web-страницы или деловые документы). Популярные ранние форматы, такие как файлы с разделяемыми запятой значениями (CSV), или подходят для табличных данных и плохо описывают псевдоструктурированные данные, или, как RTF, слишком специализированы для псевдоструктурированных текстовых документов. Это привело к широкому распространению XML как языка для обмена информацией.

XML везде

Кроме способности представлять и структурированные, и псевдоструктурированные данные, XML имеет несколько характеристик, которые обусловили его широкое использование в качестве формата представления данных. XML — расширяемый, плотформо-независимый и поддерживает локализацию, т.к. полностью совместим с Unicode. Тот факт, что XML — текстовый формат, означает, что при возникновении необходимости XML-документы можно читать и редактировать, используя стандартные инструменты редактирования текстов.

Расширяемость XML проявляется многими способами. Прежде всего, в отличие от HTML, у него нет фиксированного словаря. С XML каждый может определить специальные словари для конкретных приложений или различных отраслей промышленности. Во-вторых, приложения, обрабатывающие или использующие форматы XML, более устойчивы к изменениям в структуре предлагаемого им XML, чем приложения, которые используют другие форматы. Например, приложение, которое зависит от обработки элемента с атрибутом customer- > . Такая гибкость несвойственна другим форматам данных и является существенным преимуществом использования XML.

XML не привязан ни к одному языку программирования, операционной системе или поставщику программного обеспечения. Кстати, создавать или потреблять XML, используя различные языки программирования — слишком прямолинейно. Независимость от платформ делает XML очень полезным в качестве средства достижения возможности взаимодействовать между различными платформами программирования и операционными системами.

Преимущества представления данных в виде XML были признаны многими и привели к распространению XML-источников данных. Деловые документы, базы данных и межделовое общение — все это примеры информационных источников, которые переходят или перешли к использованию XML как формата представления. Такие продукты Microsoft как Microsoft Office®, Microsoft SQL Server™ и Microsoft .NET Framework дают возможность конечным пользователям и разработчикам создавать и использовать документы, сетевые сообщения и другие данные в виде XML.

Синтаксис XML 1.0

Как было упомянуто ранее, рекомендация W3C XML 1.0 описывает текстовый формат для описания структурированных и псевдоструктурированных данных, используя синтаксис, подобный HTML.

Сравнение XML и HTML


И HTML, и XML документы состоят из элементов, каждый из которых включает «начальный тэг» ( ), «конечный тэг» ( ) и информацию, заключенную между этими двумя тэгами (которая называется содержимым элемента). Элементы могут быть аннотированы атрибутами, содержащими метаданные об элементе и его содержимом.

Однако между HTML и XML есть существенные отличия. XML чувствителен к регистру, в то время как HTML — нет. Это значит, что в XML начальные тэги

и

различны, тогда как в HTML — это одно и то же. Другое различие между HTML и XML в том, что XML представляет концепцию правильного построения. Правила построения XML устраняют некоторую неопределенность, присущую обработке таких языков разметки как HTML, вводя такие постулаты, как то, что все значения атрибутов должны быть заключены в кавычки, и что у всех элементов должны быть или начальный и конечный тэги, или явное указание того, что это пустые элементы. Краткое описание правил построения дается в XML FAQ в разделе D.2.

Самое существенное различие между HTML и XML в том, что в HTML есть предопределенные элементы и атрибуты, поведение которых предопределено, в то время как в XML такого нет. Вместо этого, авторы документа могут создавать собственные XML-словари, предназначенные именно для их приложения или деловых нужд. В настоящее время существуют XML-словари для огромного количества отраслей промышленности и приложений: от финансовых картотек (XBRL) и финансовых операций (FpML) до Web-документов (XHTML) и сетевых протоколов (SOAP). Отсутствие предопределенных элементов и атрибутов, которые определяют, как формируется или отображается XML-документ, дает возможность авторам сосредоточиться на создании документов, которые содержат только существенную семантическую информацию в их конкретной предметной области. Отделение содержимого от представления, ставшее возможным с XML-словарями, существенно увеличивает возможности повторного использования информации и перенацеливания содержимого.

Анатомия XML-документа

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

Документ начинается с необязательного описания XML, в котором указывается, какая версия XML и кодирование символом используются. Далее следует инструкция обработки xml-stylesheet, которая используется для связывания таблицы стилей, содержащей инструкции по форматированию, с XML-документом. Таблица стилей используется для формирования привлекательного внешнего вида документа в пользовательских приложениях, таких как Web-браузеры. Инструкции обработки обычно используются для введения информации о приложении в XML-документ. Например, большинство приложений, обрабатывающих содержимое приведенного выше документа, вероятно, проигнорируют инструкцию обработки xml-stylesheet. С другой стороны, приложения, используемые для отображения XML-документа, такие как Web-браузер, могли бы использовать информацию инструкции обработки для того, чтобы определить, где располагается таблица стилей, содержащая специальные инструкции для отображения документа.

Unicode + угловые скобки = возможность взаимодействовать

Сочетание тех фактов, что синтаксис XML 1.0 — текстовый и слишком простой для синтаксического разбора, привело к использованию XML как нового формата обмена данными в случаях, когда требуется возможность межплатформенного взаимодействия. Широкая доступность синтаксических анализаторов XML для большинства популярных операционных систем упрощает для неравноправных сторон на разных платформах стандартизацию XML как формата преобразования в случае необходимости совместного использования информации.

То, что XML основан на Unicode, делает его подходящим для совместного использования информации через глобальные сети, такие как World Wide Web.

Infoset и семейство XML-технологий

Хотя возможность взаимодействовать и расширяемость платформ, получаемые при использовании текстового синтаксиса XML, и являются прекрасным примером выгоды от применения XML как формата представления данных, это всего лишь одно из преимуществ, которые XML предоставляет разработчикам приложений. Другое важное преимущество от использования XML — он предоставляет единый подход к множеству технологий по манипулированию, структурированию, преобразованию и запрашиванию данных.

Информационное множество (Infoset) XML

Рекомендация информационного множества W3C XML (W3C XML Information Set recommendation) описывает абстрактное представление XML-документа. XML Infoset, главным образом, изначально выступает в роли набора определений, используемых XML-технологиями для формального описания того, с какими частями XML-документа они работают. В терминах XML Infoset описаны несколько W3C XML-технологий, включая SOAP 1.2, XML Schema и XQuery.

XML Infoset — древовидное иерархическое представление XML-документа. Информационное множество XML-документа состоит из ряда единиц информации, которые являются абстрактным представлением компонентов XML-документа. Существуют единицы информации, представляющие документ, его элементы, атрибуты, инструкции обработки, комментарии, символы, нотации, пространства имен, неразбираемые синтаксическим анализатором сущности, неразвернутые ссылки на сущности и объявление типа документа. XML Infoset — официальная попытка определить то, что должно считаться важной информацией в XML-документе. Например, Infoset не делает различий между двумя формами пустого элемента. Таким образом, следующее

согласно XML Infoset, считается эквивалентным. Аналогично, не имеет значения и тип кавычек, используемых для атрибутов; таким образом, элементы

согласно XML Infoset, эквивалентны. Список аспектов синтаксиса XML 1.0, которые не рассматриваются XML Infoset, приведен в Приложении D рекомендации Информационного множества W3C XML.

Рекомендация Информационного множества W3C XML описывает концепцию синтетических информационных множеств, которые создаются средствами, отличными от синтаксического разбора текстового XML-документа. Синтетические информационные множества подготавливают почву для обработки с помощью XML-технологий не-XML-данных, которые могут быть преобразованы в XML Infoset. Примером обработки синтетического информационного множества является ObjectXPathNavigator (http://msdn.microsoft.com/library/en-us/dnexxml/html/xml03172003.asp), который обеспечивает возможность запрашивать объекты в .NET Framework, используя XPath, или преобразовывать их, используя XSLT.

Языки Схемы

Язык XML-схемы используется для описания структуры и содержимого XML-документа. Например, схема может использоваться для определения документа, состоящего из одного или более элементов compact-disc, каждый из которых включает в качестве дочерних элементы price, title и artist. Во время обмена документами XML-схема описывает контракт между производителем и потребителем XML, поскольку она описывает то, что составляет действительное XML-сообщение передаваемое между двумя сторонами. Хотя для XML существует несколько языков схемы, от DTD до XDR, ведущим является Язык описания XML-схемы W3C (W3C XML Schema Definition Language), сокращенно XSD.

XSD уникален среди языков XML-схемы, потому что он первым пытается вывести роль XML-схемы за рамки традиционного ее применения для описания контракта между двумя сущностями, обменивающимися документами. XSD представляет концепцию Post Schema Validation Infoset (PSVI). Совместимый XSD-обработчик принимает XML Infoset как входные данные и после проверки преобразовывает его в Информационное множества после проверки схемы (PSVI). PSVI — это исходные входные данные XML Infoset с добавленными к существующим новыми единицами информации и новыми свойствами. В Рекомендации XML-схема W3C приведен список дополнений в Информационное множества после проверки схемы (PSVI).

Одним важным классом дополнений PSVI является аннотации типов. Элементы и атрибуты получают строгий контроль типов и имеют ассоциированную информацию о типе данных. Такие XML со строгим контролем типов весьма универсальны, потому что теперь они с помощью таких технологий как XmlSerializer (http://msdn.microsoft.com/library/en-us/dnexxml/html/xml01202003.asp) из .NET Framework могут быть преобразованы в объекты, с помощью технологий SQLXML (http://msdn.microsoft.com/sqlxml) и DataSet (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemDataDataSetClassTopic.asp) из .NET Framework они могут быть преобразованы в реляционные таблицы или их можно обработать с помощью языков запросов XML, таких как XPath 2.0 и XQuery, которые используют преимущество строгого контроля типов.

Ниже показан пример фрагмента схемы, который описывает элемент items документа-образца, приведенного в разделе Анатомия XML-документа.

API, использующие модель дерева
Древовидная модель API представляет XML-документ как дерево узлов, которые обычно загружаются в память все сразу. Самая популярная древовидная модель API для XML — Объектная модель документа W3C (W3C Document Object Model — DOM). DOM обеспечивает возможность программно читать, манипулировать и изменять XML-документ.

Ниже приведен пример использования класса XmlDocument (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXmlDocumentClassTopic.asp) в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

Курсорные APIs

Курсорные API в XML можно представить как лупу, которая проходит по XML-документу, согласно указаниям фокусируясь на отдельных аспектах документа. Класс XPathNavigator в .NET Framework — это пример курсорного API в XML. Преимущество курсорных API над древовидной моделью API в том, что для них не требуется, чтобы весь XML-документ был загружен в память, что открывает двери оптимизациям со стороны создателя XML, в которых документ загружается «по мере надобности».

Вот пример использования класса XPathNavigator (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXPathXPathNavigatorClassTopic.asp) в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

Потоковые API

Потоковые API для обработки XML позволяет обрабатывать XML-документ, сохраняя в памяти только содержимое обрабатываемого в данный момент узла. Такие API делают возможной обработку больших XML-файлов без использования слишком больших объемов памяти. Существует два основных класса потоковых API для обработки XML: передающие XML-анализаторы и принимающие XML-анализаторы.

Передающие синтаксические анализаторы, такие как SAX, проходят по XML-потоку, а затем при встрече с XML-узлами «выталкивают» события в зарегистрированные обработчики событий (методы обратного вызова). Принимающие анализаторы, такие как класс XmlReader (http://msdn.microsoft.com/library/en-us/cpref/html/frlrfSystemXmlXmlReaderClassTopic.asp) в .NET Framework, работают в XML-потоке как однонаправленные курсоры.

Ниже представлен пример использования класса XmlReader в .NET Framework для получения имени исполнителя и названия первого compact-disc в элементе items.

XML-запрос

XML-преобразование

Часто надо преобразовать XML-документы из одного словаря в другой. Иногда так можно сгенерировать их в готовом для печати формате или в Web-браузере; также с помощью преобразования можно превратить документы, полученные извне, в более привычный формат.

XSLT (http://www.w3.org/TR/xslt) — первый язык XML-преобразования. Преобразование, выраженное в XSLT, описывает правила преобразования исходного дерева в результирующее дерево. Преобразование достигается путем ассоциирования шаблонов. Шаблон — это выражение XPath, может рассматриваться как регулярное выражение, ставящее части исходного дерева XML в соответствие частям строки. Шаблон ставится в соответствие элементам исходного дерева. В случаях совпадения создается экземпляр шаблона для создания части результирующего дерева. При создании результирующего дерева элементы исходного дерева могут быть отфильтрованы и реорганизованы, а произвольная структура может быть добавлена.

Следующая таблица стилей XSLT преобразовывает элемент items в Web-страницу XHTML, содержащую таблицу с информацией о компакт дисках.

XHTML-документ, созданный с использованием этой таблицы стилей, показан ниже:

Заключение

XML — это больше, чем просто текстовый формат для описания документов. Это механизм для описания структурированных и псевдоструктурированных данных, который обеспечивает доступ к богатому семейству технологий обработки таких данных. Мощные абстракции, такие как Информационное множество XML, открывают двери к обработке нетекстовых данных, таких как файловые системы, реестр Windows®, реляционные базы данных и даже объекты языков программирования, с помощью XML-технологий. XML еще на один шаг приблизил нас к универсальному доступу к данным.

Прикладные программные интерфейсы и архитектура Java для XML

Цель данной статьи — прояснить, как действуют прикладные программные интерфейсы (API) Java для XML, и как они облегчают написание сетевых приложений. Эта статья описывает каждый API в отдельности, и затем представляет сценарий, показывающий их совместную работу. Также упоминаются и другие технологии, доступные в настоящее время, и их возможное использование в сочетании с прикладными программными интерфейсами Java для XML. В конце статьи вы найдете глоссарий, который поможет вам разобраться во всех акронимах и разъяснит терминологию.

Техническая документация

Авторские права принадлежат Sun Microsystems, Inc. 901 San Antonio Road, Palo Alto, CA 94303 U. S. A. 650-960-1300. Все права защищены. Этот продукт или документ охраняется авторским правом и распространяется по лицензии, ограничивающей его использование, копирование, распространение и перекомпилирование.

Никакая из частей данного продукта не может быть воспроизведена в какой бы то ни было форме и при помощи любых средств без предварительного письменного разрешения Sun Microsystems и ее лицензиаров, при существовании таковых. Все стороннее программное обеспечение, включая шрифты, защищено и лицензировано Sun и ее поставщиками. Части продукта могут быть получены из Berkeley BSD систем, по лицензии от Калифорнийского Университета. UNIX является зарегистрированной торговой маркой в США и других странах по эксклюзивной лицензии X/ Open Company, Ltd. For Netscape Communicator TM , соответствующее уведомление прилагается: Copyright 1995 Netscape Communications Corporation. Все права защищены.

Sun, Sun Microsystems, the Sun logo, AnswerBook2, docs.sun.com, Solaris, Java, Java 2 Platform, Enterprise Edition, J2EE, JavaServer Pages, JSP, Java API for XML Processing, Java Architecture for XML Binding, Java API for XML Messaging, Java API for XML Registries, and Java API for XML-based RPC являются торговыми марками, зарегистрированными торговыми марками или служебными лейблами Sun Microsystems, Inc. в США и других странах. Все лейблы SPARC используются по лицензии и являются лейблами или зарегистрированными торговыми марками SPARC International, Inc. в США и других странах. Продукция, содержащая лейблы SPARC, основана на архитектуре, разработанной Sun Microsystems, Inc.

The OPEN LOOK and Sun TM Graphical User Interface были разработаны Sun Microsystems, Inc. для своих пользователей и лицензиатов. Sun признает заслуги Xerox в разработке и развитии визуального или графического пользовательского интерфейса для компьютерной индустрии. Sun обладает неразделительной лицензией от Xerox до Xerox Graphical User Interface, чья лицензия так же включает в себя лицензии Sun, которая ввела графический интерфейс пользователя OPEN LOOK, и во всем остальном условия письменного лицензионного соглашения Sun выполнены.

Введение и краткий обзор

Язык XML делает данные переносимыми. Платформа Java делает код переносимым. Интерфейс Java API для XML делает удобным использование самого XML. Объедините эти факторы вместе, и вы получите идеальное сочетание: переносимость данных, переносимость кода и простота использования. В действительности, с помощью API языка Java для XML вы можете использовать достоинства XML при помощи незначительного использования этого языка или совсем без него.

Предприятия быстро находят преимущества использования XML при интеграции данных как внутри самого предприятия – для совместного использования среди своих подразделений, так и вне него – для совместного использования с другими предприятиями. Благодаря интеграции данных, которую предлагает язык XML, он стал основой для вычислений, связанных с Web.

Крайне трудная часть развивающихся сетевых служб – планирование инфраструктуры, так называемой «системы трубопроводов», включающей безопасность, возможность передачи сообщений, распределенное управление транзакциями и управление пулом соединений. Еще одна сложность состоит в том, что сетевые службы должны обслуживать огромное количество пользователей одновременно, поэтому приложения должны быть масштабируемыми. Этим требованиям в точности удовлетворяет платформа Java TM 2, Enterprise Edition (J2EE). Добавьте ко всему этому то, что J2EE является проверенной технологией, включающей многочисленных производителей предлагающих совместимую продукцию в наши дни, и получится очевидный факт, состоящий в том, что платформа J2EE является наилучшим инструментальным комплексом разработки сетевых служб. И с помощью новых API языка Java для XML разработка сетевых служб становится все легче и легче.

Цель данной статьи — прояснить, как действуют прикладные программные интерфейсы (API) Java для XML, и как они облегчают написание сетевых приложений. Эта статья описывает каждый API в отдельности, и затем представляет сценарий, показывающий их работу вместе. Также упоминаются и другие технологии, доступные в наше время, и их возможное использование в сочетании с прикладными программными интерфейсами Java для XML. В конце статьи вы найдете глоссарий, который поможет вам разобраться во всех акронимах и разъяснит терминологию.

Подробная информация о различных API языка Java для XML доступна по адресу:

Что такое XML?

XML (eXtensible Markup Language – расширяемый язык разметки) – это стандартный, независимый от системы способ представления данных. Как и HTML (HyperText Markup Language – язык разметки гипертекста), XML заключает данные внутрь тэгов, однако между этими языками существуют значительные различия. Во-первых, тэги XML связаны с содержанием текста, заключенного между ними, в то время как тэги HTML определяют способ отображения текста. Следующий пример отображает прайс-лист с названием и ценой двух сортов кофе:

Тэги and указывают синтаксическому анализатору, что информация между ними касается кофе. Два других тэга внутри тэгов определяют, что заключенная в них информация — это название кофе и его цена за 1 фунт. Благодаря тому, что XML тэги показывают содержимое и структуру данных, заключенных в них, они делают возможными такие операции, как архивирование и поиск.

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

Благодаря расширяемости, которую предоставляет XML, вы можете создавать тэги, которые вам требуются для данного конкретного типа документа. Для определения тэгов используется язык схем XML. Схема описывает структуру набора XML документов и может быть использована для создания оглавлений XML документов. Вероятно, самым широко используемым языком схем является Document Type Definition (язык классов в документах). Схема, написанная на этом языке, называется DTD. Следующий пример DTD задает тэги, которые используются в прайс-листе из предыдущего примера. Он определяет четыре тэга (элемента) и далее описывает тэги, которые могут потребоваться (или обязательно потребуются) в других тэгах. DTD также задает иерархию XML документа, включая порядок, в котором тэги должны использоваться.

Первая строка в этом фрагменте задает элемент самого высокого уровня, priceList, который означает, что все остальные тэги в документе будут расположены между тэгами

. Первая строка также сообщает, что элемент priceList обязан включать в себя один или более элементов coffee (на это указывает знак плюс). Вторая строка определяет, что каждый элемент coffee, в свою очередь, должен содержать два элемента: name и price. Третья и четвертая строки указывают, что данные между тэгами и , а также

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

Что делает XML переносимым?

Именно описания DTD, подобные DTD priceList, обеспечивают переносимость XML формата данных. Если приложение получает priceList в XML формате, и имеет в своем распоряжении priceList DTD, то оно может обработать данные согласно правилам, определенным в DTD. Например, имея описание DTD priсeList, анализатор будет знать структуру и вид содержимого для любого XML документа, основанного на данном DTD. Если анализатор призван проверить документ на соответствие, то он поймет, что документ не подходит, если в нем присутствуют элементы, не включенные в DTD, такие как , к примеру, или скажем, если элемент price стоит раньше, чем name.

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

Краткий обзор прикладных программных интерфейсов (API) языка Java для XML

Прикладные программные интерфейсы Java для XML позволяют вам писать Web-приложения целиком и полностью на языке программирования Java. Эти интерфейсы делятся на две обширные категории: одна из них работает с XML документами напрямую, другая же — с помощью подпрограмм.

Прикладные программные интерфейсы (API), ориентированные на прямую работу с документами:

Java TM API for XML Processing (JAXP) – обрабатывает XML документы, используя различные синтаксические анализаторы.

Java TM Architecture for XML Binding (JAXB) – преобразовывает элементы XML в классы языка программирования Java.

Прикладные программные интерфейсы (API), ориентированные на работу с документами при помощи подпрограмм:

Java TM API for XML Messaging (JAXM) – позволяет посылать SOAP (Simple Object Access Protocol) сообщения в Internet стандартным способом.

Java TM API for XML Registries (JAXR) – обеспечивает стандартный способ получения доступа к производственному учету и совместно используемой информации.

Java TM API for XML-based RPC (JAX-RPC) – посылает запросы процедур SOAP удаленным сторонам в Internet и получает результаты.

Возможно, самое главное свойство всех API языка Java for XML состоит в том, что они поддерживают промышленные стандарты, таким образом, обеспечивая возможность для взаимодействия. Различные группы по стандартам сетевых взаимодействий, такие как WWW-консорциум (World Wide Web Consortium, W3C) и Организация по развитию стандартов структурированной информации (Organization for the Advancement of Structured Information Standards, OASIS), определили способы, как надо действовать, чтобы компании, следующие эти стандартам, могли заставить данные и приложения работать вместе.

Еще одна характерная особенность различных API языка Java для XML – то, что они обеспечивают большую гибкость, и пользователи используют эту гибкость в работе. Например, код JAXP может применять различные средства для обработки XML документов, а код JAXM может оперировать различными протоколами передачи поверх SOAP. Конструкторы также отличаются гибкостью. Прикладные программные интерфейсы Java для XML определяют строгие требования совместимости, для того чтобы не только гарантировать соответствие реализаций стандартным функциональным возможностям, но также дать разработчикам большой простор для исполнения реализаций, приспособленные под конкретные задачи.

Следующие главы рассматривают каждый из этих API и дают общее представление об их использовании.

Краткий обзор

JAXP (The Java TM API for XML Processing) упрощает обработку XML данных с помощью программам, написанными на языке программирования JAVA. JAXP усиливает стандартные анализаторы SAX (Simple API for XML Parsing) и DOM (Document Object Model) таким образом, что вам предоставляется выбор между анализом данных как потока событий или созданием объектной структуры для них. JAXP версии 1.1 также поддерживает стандарт XSLT (XML Stylesheet Language Transformations), предоставляя управление представлением данных и давая возможность преобразования информации в другие XML документы или другие форматы, такие как HTML. JAXP также обеспечивает поддержку пространства имен (namespace), позволяя вам работать с DTD. В противном случае, это могло бы привести к конфликту имен.

Обладая гибкостью, JAXP дает возможность использовать в вашей программе любой XML-совместимый синтаксический анализатор. Это возможно благодаря так называемому слою подключений, который разрешает вам подключать прикладные программные интерфейсы SAX или DOM. Слой подключений также позволяет подключать XSL процессор, что в свою очередь позволяет вам управлять отображением XML данных. JAXP 1.1 Reference Implementation (доступно по адресу http://java.sun.com/xml) предоставляет XSLT процессор Xanon и синтаксический анализатор Crimson, разработанные совместно Sun и организацией Apache Software Foundation, которая предоставляет программное обеспечение с открытым исходным кодом.

Прикладной программный интерфейс (API) SAX

SAX создает прикладной программный интерфейс для синтаксического анализатора, основанного на событиях. Основанный на событиях анализатор просматривает XML документ от начала и до конца, посылая сообщение запущенному приложению каждый раз, когда он встречает синтаксическую конструкцию. Анализатор SAX использует методы ContentHandler интерфейса для отправки сообщений программе. Например, когда анализатору попадается символ (» SAXParserFactory factory = SAXParserFactory.newInstance ( ) ;
SAXParser saxParser = factory.newSAXParser ( ) ;
saxParser.parse ( «priceList.xml» , handler ) ;

Результат работы метода parse зависит, разумеется, от того, как были применены handler методы. Анализатор SAX будет считывать файл priceList.xml сточка за строчкой, применяя соответствующие методы. Кроме уже упомянутых, анализатор будет использовать и другие методы, такие как startDocument, endDocument, ignorableWhiteSpace и processingInstructions, но эти методы сохраняют свое начальное значение, и, следовательно, не станут ничего делать.

Следующий пример определения методов иллюстрирует один из путей применения characters и startElement, для поиска цены Mocha Java. Благодаря способу функционирования синтаксического анализатора SAX, эти два метода одновременно ищут элемент name, строку «Mocha Java», и элемент price непосредственно следующий за Mocha Java. Эти методы используют три флага, чтобы следить за встречаемыми условиями. Помните, что анализатор SAX вызовет оба метода более одного раза, прежде чем встретит нужную цену.

public void startElement ( . . . , String elementName, . . . ) <
if ( elementName.equals ( «name» ) ) <
inName = true ;
>
else if ( elementName.equals ( «price» ) && inMochaJava ) <
inPrice = true ;
inName = false ;
>
>

public void characters ( char [] buf, int offset, int len ) <
String s = new String ( buf, offset, len ) ;
if ( inName && s.equals ( «Mocha Java» ) ) <
inMochaJava = true ;
inName = false ;
> else if ( inPrice ) <
System.out.println ( «The price of Mocha Java is: » + s ) ;
inMochaJava = false ;
inPrice = false ;
>
>

Как только анализатор найдет элемент coffee Mocha Java, будут вызваны следующие методы:

Синтаксический анализатор SAX во время работы с данными XML может производить проверку на соответствие документа DTD. SAX проверит, создан ли он при помощи конструктора объектов SAXParserFactory, что и активизирует проверку документа. Для SAXParserFactory это делается следующим кодом:

Таким образом, для того чтобы анализатор понимал, какой DTD использовать для проверки, XML документ должен передать DOCTYPE. Объявление DOCTYPE должно быть подобно этому:

Прикладной программный интерфейс объектной модели документа (DOM API)

DOM API (Document Object Model – объектная модель документа), описанный W3C DOM Working Group, представляет собой набор интерфейсов для построения объектного представления в форме дерева анализируемого XML документа. Построив DOM один раз, вы можете управлять ею с помощью DOM методов, таких как insert и remove (вставка и удаление), абсолютно аналогично тому, как вы бы работали с любыми другими деревьями. Таким образом, в отличие от синтаксического анализатора SAX, анализатор DOM позволяет произвольный доступ к каким-либо конкретным частям документа. Другое отличие состоит в том, что с помощью SAX вы можете только считывать XML документы, а DOM дает вам возможность построить в памяти объектную модель и работать уже с ней, добавляя новые элементы и удаляя ненужные.

В предыдущем примере мы использовали анализатор SAX для поиска фрагмента во всем документе. Использование анализатора DOM потребовало бы построения объектной модели всего документа в памяти, что, в общем-то, менее эффективно для поиска всего лишь нескольких небольших фрагментов, особенно при работе с большими документами. В следующем примере с помощью DOM мы добавим в прайс несколько новых марок кофе. Использование для этой цели анализатора SAX невозможно по причине того, что он может лишь считывать данные.

Предположим, что в прайс-лист требуется добавить кофе Kona. Для этого нужно прочитать прайс-лист в XML формате с помощью DOM и добавить в него новый элемент типа coffee с его названием и ценой. Следующий код создает объект DocumentBuilderFactory, который в дальнейшем используется для создания объекта DocumentBuilder builder. Затем код вызывает анализатор параметра builder, передавая файл priceList.xml.

На этом этапе мы получаем в памяти DOM-представление документа. Следующий код добавляет в прайс-лист новый кофе (с названием «Kona» и ценой 13.50). Так как новый кофе требуется добавить именно перед элементом «Mocha Java», то сначала нужно получить список элементов name и перебирать названия, пока не встретится «Mocha Java». Используя интерфейс Node (узел), включенный в пакет org.w3c.dom, код создает для нового элемента coffee объект Node, а также новые объекты Node для названия и цены. Элементы name и price состоят из символьных данных, поэтому для каждого из них код создает TextNode объекты и добавляет текстовые узлы в узловое представление элементов name и price.

Проверку синтаксический анализатор DOM выполняет аналогично анализатору SAX: перед началом использования DOM вызывается setValidating(true) в конструкторе DOM и создается ваш синтаксический анализатор, после чего вы можете быть уверенны, что XML документ, который вы анализируете, соответствует DTD, декларированному в DOCTYPE.

Пространство имен XML

Все имена в DTD являются уникальными, избегая, таким образом, двусмысленности. Однако если отдельный XML документ связан более чем с одним DTD, то есть вероятность, что два или более DTD содержат одно и то же имя. Поэтому нужно выделить пространство имен для каждого DTD, чтобы анализатор знал, какое из определений использовать при обработке запросов от конкретного DTD.

Существует стандартная система обозначений для объявления пространства имен XML, которое, как правило, имеет место в корневом элементе XML документа. В следующем примере для объявления пространства имен XML указание xmlns определяет nsName как пространство имен, и nsName ставится в соответствие URL с реальным пространством имен:

Внутри документа принадлежность элемента к соответствующему пространству имен определяется следующим образом:

Чтобы научить SAX или DOM распознавать пространства имен, нужно использовать метод setNamespaceAware(true) вашего ParserFactory. После этого любой анализатор, созданный этим конструктором синтаксических анализаторов, будет знать соответствующие пространства имен.

Прикладной интерфейс программирования к языку описания стилей XML (XSLT API)

XSLT (XSL Transformation), описанная W3C XSL Working Group, описывает язык преобразования XML документов в другие XML документы или другие форматы. Чтобы выполнить преобразование, как правило, нужно подключить таблицу стилей, написанную на XSL (XML Stylesheet Language – язык таблиц стилей). Таблицы стилей XSL определяют способ отображения XML данных. Чтобы выполнить преобразование, XSLT использует команды форматирования в таблице стилей. Преобразованный документ может представлять собой как XML документ, так и документ в ином формате, например, в формате HTML.

JAXP поддерживает XSLT с помощью пакета javax.xml.transform, который позволяет подключать XSLT. Подпакеты содержат SAX-, DOM- и потоковые API, которые дают возможность преобразовывать DOM-деревья в события SAX. Следующие два примера иллюстрируют, как из DOM-дерева можно создать XML документ, и после чего преобразовать полученный XML документ в HTML, используя таблицу стилей XSL.

Преобразование DOM-дерева в XML документ

Чтобы преобразовать DOM-дерево из предыдущей главы в XML документ, приведенный ниже, код первым делом создает Transformer object , который будет выполнять преобразование.

Используя корневой узел DOM-дерева, следующая строка создает DOMSource объект как источник преобразования.

А эта часть кода конструирует объект StreamResult для получения результатов преобразования и трансформации дерева в XML.

Преобразование XML документа в HTML документ

XSLT можно также использовать для того, чтобы трансформировать только что полученный XML документ newXML.xml в HTML с помощью таблицы стилей. При создании таблицы стилей для связи с XSL конструкциями используется пространство имен XML. Каждая таблица, к примеру, содержит корневой элемент, определяющий язык стилей, что иллюстрирует следующая строка.

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

Следующий пример определяет, что XML данные преобразованы в HTML, и таким образом все сорта кофе размещены в таблице.

Чтобы выполнить преобразование, нужно получить XSLT конвертор и применить с его помощью таблицы стилей к XML данным. Данный код получает конвертор, для чего сначала инициализирет TransformerFactory объект, затем считывает таблицу стилей и XML файлы, создает файл для записи HTML кода и в итоге получает Transformer объект transformer из объекта tFactory типа TransformerFactory.

Преобразование заканчивается вызовом метода transform, который помещает преобразованные данные в выходной поток (output stream).

transformer.transform(new StreamSource(sourceId), new StreamResult(os));

JAXB предлагает быстрый и удобный способ создания двухстороннего преобразования между XML документами и классами языка Java. Задавая DTD, компилятор JAXB создает набор классов Java, содержащий весь код, который необходим для анализа XML документов, основанных на данной схеме. Разработчик, использующий созданные классы, может строить дерево объектов Java, изображающих XML документ, обрабатывать содержимое этого дерева и заново создавать XML документы из него.

Для того чтобы начать использование приложения JAXB, все, что вам нужно, это схема, и для данной версии JAXB это должна быть DTD. Вы можете написать свою схему DTD, или же вы можете получить ее где-либо еще, например, из стандартного репозитория DTD через JAXB.

Как только у вас появляется схема DTD, вы связываете ее с набором классов следующим образом:

Запишите связующую схему, которая содержит инструкции для привязки схемы к классам. Связующая схема написана на языке связи, основанном на XML и содержащемся в JAXB.

Запустите компилятор схем, который берет DTD и связывающую схему и создает из них классы. Каждый класс, создаваемый компилятором схем, обладает средствами для считывания и изменения параметров. После того, как экземпляр класса создан и наполнен информацией, вы можете использовать эти средства доступа для обращения к данным. Набор средств доступа называется property (свойством).

Создание классов из DTD

В качестве примера генерирования классов из DTD рассмотрим следующую DTD, которая называется priceList.dtd.

JAXB компилятор схем достаточно мощен для проведения правильного анализа DTD и связующей схемы, которая устанавливает только основной элемент документа. Все, что вам нужно определить в связывающей схеме, — то, что элемент price преобразовывается к состоянию, которое принимает и возвращает значение типа BigDecimal (большого целого):

Из данной DTD и связующей схемы генератор схем создает класс PriceList и класс Coffee.

Класс PriceList содержит конструктор и параметр List, с которым связан элемент «кофе».

Класс Coffee включает в себя конструктор и переменную для представления названия кофе и параметра для представления цены.

Средствами доступа к элементу «цена» являются функции:


Как класс PriceList, так и класс Coffee содержит средства для демаршализации, подтверждения и размещения. Демаршализация – это процесс построения объектного представления данных XML. Подтверждение – это процесс проверки соответствия объектов техническим требованиям DTD. Размещение – это процесс создания данных XML из объектного представления.

Создание объектных представлений данных XML

После построения классов, вы можете писать Java приложение, используя классы, и формировать объектные представления XML документов, которые являются действующими относительно DTD. Каждый объект соответствует элементу в XML документе. Подобным образом, каждый объект является экземпляром класса из набора созданных классов. Так как эти объекты отображают как документ, так и классы, то у вас есть два способа построения дерева объектов Java: демаршализацией доступного XML документа или обработкой объектов классов. Таким образом, JAXM дает возможность вам как обрабатывать существующие XML документы, так и создавать новые данные XML с помощью обработки созданных классов.

Предположим, что у вас есть следующий XML документ:

Для того чтобы демаршализовать этот XML документ, вы создаете из него поток ввода и вызываете метод демаршализации класса PriceList:

Теперь у вас есть дерево объектов Java, в корне которого находится объект myPrices.

Допустим, вы хотите создать собственный список цен на кофе как XML документ. Сначала вы порождаете дерево объектов с помощью обработки данных, а затем размещаете это дерево в XML документе. Для того чтобы получить дерево объектов при помощи реализации, создайте новый объект типа PriceList, затем получите из него список объектов Coffee, создайте новый объект типа Coffee и в заключение добавьте его в список:

Представив данные XML в форме объектного дерева, вы можете работать с ними так же, как если бы вы работали с объектами Java. Таким образом, JAXB предоставляет интерфейс программирования Java для данных XML и также позволяет цельную интеграцию данных XML в приложения Java.

Доступ к данным из дерева объектов

Предположим, что вы хотите поменять цену кофе Mocha Java в первом созданном вами объекте. Все, что вам необходимо сделать – это найти элемент Mocha Java в списке кофе и установить новую цену с помощью вызова процедуры setPrice для объекта Coffee:

Формирование XML документов из дерева объектов

Использовали ли вы демаршализацию или реализацию для построения объектного представления данных, вы можете разместить объекты в XML документе. Это означает, что JAXB тоже позволяет вам создавать новые качественные XML документы, являющиеся действительными относительно схемы.

Для того чтобы разместить ваше измененное дерево объектов в XML документе, создайте XML файл и выходной поток для него и вызовите разделяющую функцию для объекта myNewPrices:

Резюме

По существу, JAXB обеспечивает взаимодействие между технологией Java и XML. Так же, как XML документ – экземпляр схемы, объект Java – экземпляр класса. Таким образом, JAXB позволяет вам создавать объекты Java на таком же абстрактном уровне, как и данные XML. Представление информации таким способом дает вам возможность управлять ей таким же образом, как если бы вы манипулировали объектами Java, что облегчает создание приложений для обработки данных XML. Как только вы представите ваши данные в форме объектов Java, к ней легко можно будет обратиться. К тому же, после работы с данными, вы можете записать объекты Java в новый полноценный XML документ. JAXB представляет собой самый простой способ доступа к данным XML, при котором вы освобождаетесь от написания кода для анализа и обработки данных, для того чтобы писать приложения, которые будут действительно использовать данные.

Различия между JAXP и JAXB

JAXP и JAXB служат весьма различным целям. Выбор архитектуры API зависит от требований вашего приложения. Одним из достоинств JAXP является то, что он позволяет вам анализировать и обрабатывать данные из того же самого набора прикладных программных интерфейсов (API). Если вы хотите выхватить всего лишь часть данных из большого документа, вам следует использовать SAX парсер по причине того, что он очень быстро анализирует данные как поток. Если ваш документ не слишком большой, и вы собираетесь добавить или удалить информацию из него, то вам следует использовать модель DOM. Хотя дерево DOM может потребовать большого объема памяти, API модели DOM включает в себя обыкновенные функции управления деревом. Если же вы намереваетесь изменить формат данных, то вам следует использовать JAXP, который содержит трансформирующий API и XSLT в эталонным исполнении, позволяющие вам преобразовывать XML документы, события SAX или деревья DOM. JAXP дает вам возможность выбора, проверять достоверность данных или нет.

Если вы хотите построить объектное представление XML данных, а также обойти ограничения памяти DOM, то вам также следует использовать JAXB. Классы, созданные с помощью JAXB, не обладают возможностью управления деревьями, а это приводит к тому, что дерево объектов JAXB занимает небольшой объем памяти. Другим достоинством объектного дерева такого типа является возможность соединять деревья из условия, чтобы дочерний объект мог иметь более одного родительского. Кроме того, обработка данных с помощью JAXB осуществляется также быстро, как и обработка анализатором SAX, т.к. созданные классы содержат всю логику DTD, таким образом, избегая динамической интерпретации, которую анализатор SAX должен выполнить. То обстоятельство, что JAXB нуждается в DTD, делает его менее гибким, но это требование обеспечивает обработку только правильных данных. Эта гарантия очень важна, особенно в случае получения приложением информации из другого источника. Если документ не содержит DTD, он не может определить содержание данных и метод их обработки. Другое преимущество JAXB перед JAXP состоит в том, что он позволяет определять, каким образом ваш код будет генерироваться из DTD, включая типы данных, которые связующий элемент будет принимать и возвращать.

Используйте JAXB в случае, когда вы хотите:

Обращаться к данным в памяти, но вам не нужна возможность обработки деревьев

Обрабатывать только верные данные

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

Создавать объектные представления данных XML

Используйте JAXP в случае, когда вы хотите:

Иметь гибкость в отношении способа доступа к данным: либо последовательно с помощью SAX, либо произвольно в памяти с помощью DOM

Использовать ваш код обработки для документов, построенных на различных DTD

Анализировать документы, которые не обязательно являются правильными

Применять XSLT преобразования

Вставлять или удалять элементы из дерева объектов, представляющего XML данные

Краткий обзор

API языка Java для обмена XML сообщениями (The Java тм API for XML Messaging, JAXM) предоставляет стандартный способ отправки XML документов через Internet. Он основан на протоколе SOAP версии 1.1 и SOAP в спецификации Attachments и может быть расширен для работы с протоколами сообщений более высоких уровней, такие как ebXML.

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

Провайдер обмена сообщениями, проводящий сообщения, может уделить внимание служебным деталям, таким как назначение идентификатора сообщений, хранение сообщений и отслеживание того, было ли сообщение доставлено до этого. Провайдер обмена сообщениями может также заново послать сообщение, которое не дошло до места назначения при первой попытке доставки. Вся прелесть такой службы передачи сообщений состоит в том, что клиент, использующий технологию JAXM («JAXM client»), находится в полном неведении относительно того, что провайдер делает в фоновом режиме. Этот клиент JAXM просто вызывает процедуры JAXM, и провайдер в соответствии со структурой сообщения выполняет все действия.

Обычно предприятие пользуется услугами провайдера для передачи сообщений, но также возможно передавать JAXM сообщения и без него. В этом случае, клиент JAXM (называемый автономным) ограничен посылкой сообщений типа «точка-точка» непосредственно в сетевую службу, выполняющей функции передачи сообщений запросов и ответов. Передача ответов и запросов происходит синхронно, то есть, запрос послан, и его ответ получен в одной при той же операции. Сообщение запрос-ответ передается в объект SOAPConnection, путем вызова процедуры SOAPConnection.call, которая посылает сообщение и останавливает свою работу до тех пор, пока не получит ответ. Автономный клиент может управлять только клиентские задачи, то есть отправлять запросы и получать на них ответы. Напротив, клиент JAXM, пользующийся услугами провайдера для обмена сообщений, может выполнять как клиентские, так и серверные (сервисные) задачи. Исполняя роль клиента, он может посылать запросы; в роли сервера, он может получать запросы, обрабатывать их и посылать ответы на них.

Обычно передача сообщений JAXM обычно происходит внутри контейнера, как правило, являющегося сервлетом (servlet) или контейнером J2EE TM . Сетевая служба, которая использует провайдера передачи сообщений и применяется в контейнере, обладает возможностью отправки односторонних сообщений: это означает, что вы можете получать запросы и отсылать через некоторое время на них ответы, являющимися также односторонними сообщениями.

JAXM сообщение состоит из двух частей, обязательной SOAP части и дополнительной, прикрепленной части. SOAP часть, состоящая из объекта SOAPEnvelope содержит элементы SOAPHeader и SOAPBody. Объект SOAPBody может хранить XML документы в теле посылаемого сообщения. Если вы хотите послать не XML документ, то ваше сообщение должно будет хранить еще и прикрепленную часть, наряду с SOAP частью. На содержание прикрепляемой части ограничений не существуют, поэтому вы можете посылать изображения или любой другой документ, включая и XML.

Установление соединения

Первое, что надо сделать JAXM клиенту, это установить связь, будь то соединение SOAPConnection или ProviderConnection.

Установление связи «точка-точка»

Автономный клиент ограничен использованием объекта SOAPConnection, который является соединением типа «точка-точка», идущим напрямую от отправителя к получателю. Все подключения JAXM создаются конструктором соединений. В случае объекта SOAPConnection, конструктор является объектом SOAPConnectionFactory. Клиент получает заданное по умолчанию действие для объекта SOAPConnectionFactory, вызывая следующую строку программы:

Клиент может использовать объект factory для создания объекта SOAPConnection:

Установка соединения с провайдером сообщений

Для того чтобы пользоваться услугами провайдера сообщений, приложение должно получить ProviderConnection объект, который предпочтительнее должен быть соединением с провайдером сообщений, а не с определенным адресатом. Существует два способа получения ProviderConnection объекта, один из них схож со способом получения автономным клиентом SOAPConnection объекта. Этот способ включает в себя получение экземпляра подразумеваемой реализации для объекта ProviderConnectionFactory, который затем используется для создания соединения:

Переменная pcCon представляет собой соединение с заданной по умолчанию реализацией провайдеру JAXM сообщений.

Второй способ создать объект ProviderConnection – получить объект ProviderConnectionFactory, введенный для создания соединения с определенным провайдером сообщений. Следующий код демонстрирует получение такого объекта ProviderConnectionFactory и его использование для установки связи. Первые две строки используют JNDI API для поиска необходимого объекта ProviderConnectionFactory в службы имен, где он был внесен в список с именем «CoffeeBreakProvider». Передавая это логическое имя в качестве аргумента, поиск возвращает объект ProviderConnectionFactory, с которым было связано логическое имя. Возвращаемое значение является объектом языка Java, который должен быть ограничен до объекта ProviderConnectionFactory для того, чтобы он мог использоваться для установки соединения. Третья строка использует JAXM метод для фактического создания подключения:

Элемент con типа ProviderConnection символизирует соединение к провайдеру компании Coffee Break.

Создание сообщения

Как и соединения, сообщения создаются конструктором. И аналогично случаю с конструкторами соединений, объекты MessageFactory так же могут быть получены двумя способами. Первый способ состоит в получении экземпляра заданной по умолчанию реализации класса MessageFactory. Этот экземпляр может затем использоваться для создания основного SOAPMessage объекта.

Все SOAPMessage объекты, которые создает messageFactory, включая элемент m в предыдущей строке кода, будут основными сообщениями протокола SOAP. Это значит, что у них не будет заранее определенных заголовков.

Одним из факторов гибкости JAXM API является возможность особого использования SOAP заголовка. Например, ebXML или BizTalk протоколы могут быть основаны на передаче сообщений по протоколу SOAP. Такое использование SOAP данной группой стандартов или индустрией, называется конфигурацией или профилем (profile). При втором способе создания объекта типа MessageFactory, вы используете метод createMessageFactory объекта ProviderConnection и задаете для него профиль. SOAPMessage объекты, созданные получившимся MessageFactory объектом, будут поддерживать особенную конфигурацию. Например, в следующем фрагменте кода, в котором идентификатор schemaURI является URI схемы с требуемой конфигурацией, объект m2 будет поддерживать профиль сообщений, который подается в createMessageFactory.

Оба новых SOAPMessage объекта – m и m2 – автоматически содержат нужные элементы SOAPPart, SOAPEnvelope и SOAPBody, а также дополнительный элемент SOAPHeader (который включен для удобства). Элементы SOAPHeader и SOAPBody изначально пустые, и в следующих разделах будут описаны стандартные способы для добавления содержимого.

Заполнение сообщения

Информация может быть занесена в объект SOAPPart, в один или более объект AttachmentPart или же в обе части сообщения.

Заполнение части SOAP сообщения

Как было раннее установлено, все сообщения содержат объект SOAPPart, который включает в себя элемент SOAPBody и элемент SOAPEnvelope, содержащий параметр SOAPHeader. Один из способов заполнения SOAP части сообщения – это создание объекта SOAPHeaderElement или объекта SOAPBodyElement и добавление XML документа, который вы получаете с помощью функции SOAPElement.addTextNode. Первые три строки следующего фрагмента кода обращаются к телу объекта SOAPBody, который используется для того, чтобы создать новый элемент SOAPBodyElement и добавить его к телу. Аргумент, передаваемый функции createName, является Name объектом, определяющим добавление элемента SOAPBodyElement. Последняя строка передает XML строку функции addTextNode:

Другой способ состоит в заполнении элемента SOAPPart с помощью передачи элемента javax.xml.transform.Source, который может быть SAXSource, либо DOMSource, либо StreamSource объектом. Исходный объект содержит информацию для SOAP части сообщения, а также информацию, необходимую для того, чтобы вести себя как исходный вход. Объект StreamSource будет содержать информацию в форме XML документа; объекты SAXSource, либо DOMSource, будут включать в себя информацию и команды для преобразования ее в XML документ.

Следующие фрагменты кода иллюстрируют заполнение объекта DOMSource. Первый шаг – получить объект SOAPPart из элемента SOAPMessage. Затем код использует средства JAXP для создания XML документа, который надо добавить. Он использует элемент DocumentBulderFactory для получения объекта DocumentBulder. Затем он анализирует заданный файл для формирования документа, который будет использоваться для инициализации объекта DOMSource. В заключение, код передает элемент DOMSource объекта domSource функции SOAPPart.setContent:

Заполнение прикрепляемой части сообщения

Элемент Message может и не содержать присоединенных частей, но если в нем есть что-либо не являющееся XML документом, то он должен включать прикрепляемую часть. Этот элемент может иметь в своем составе любое количество прикрепленных частей, и они могут содержать любую информацию, начиная с обычного текста, и кончая изображениями. В следующем фрагменте кода содержимое является рисунком формата JPEG, чей URL используется для инициализации объекта dh, являющегося переменной типа javax.activation.DataHandler. Переменная m типа Message создает объект attachPart типа AttachmentPart, который инициализируется обработчиком данных, имеющем на входе URL картинки. В заключение, сообщение присоединяет объект attachPart к себе.

Объект SOAPMessage может также задавать содержание объекта AttachmentPart с помощью передачи элемента Object и типа его содержания функции createAttachmentPart.

Третий вариант подразумевает создание пустого AttachmentPart объекта и последующей передачи элемента Object и его типа функции AttachmentPart.setContent. В этом фрагменте кода элемент Object является переменной типа ByteArrayInputStream, инициализированной изображением jpeg.

Отправка сообщения

После того как вы заполнили объект SOAPMessage, вы готовы его послать. Автономный клиент использует вызов SOAPConnection процедуры для отправки сообщения. Это функция посылает сообщение и затем блокируется до тех пор, пока не получит ответ. Параметрами вызова этой функции являются отправляемое сообщение и объект Endpoint, содержащий URL получателя.

Приложение, оперирующее с провайдером сообщений, использует функцию ProviderConnection для отправки сообщения. Эта процедура посылает сообщение асинхронно, что означает, что она отправляет сообщение и сразу же возвращается к работе. Ответ, если таковой существует, будет отправлен в течение отдельной операции позже. Заметим, что эта функция получает лишь один параметр – отправляемое сообщение. Провайдер сообщений использует заголовочную информацию для определения адресата.

Краткий обзор

Java TM API для XML Registries (JAXP) предоставляет удобный путь для доступа к стандартным деловым регистрационным формам через Интернет. Деловые регистрационные формы часто описываются как «желтые страницы» электронной коммерции, потому что они содержат списки предприятий и продукции или услуг, предлагаемых этими предприятиями. JAXR позволяет разработчикам писать Java приложения единым образом, используя деловые регистрационные формы, основанные на открытых стандартах (таких как ebXML), или промышленных синдикативных описаний (таких как UDDI).

Предприятия могут регистрироваться в регистрационных формах или находить другие компании, с которыми им хотелось бы сотрудничать. К тому же, они могут сделать публичными свои материалы или найти материалы, опубликованные другими организациями. Группы норм содержат DTD для конкретных типов XML документов, и две компании могут, к примеру, принять DTD для своих стандартных промышленных форм заказа. Благодаря тому, что DTD поддерживается стандартной деловой регистрационной формой, обе организации могут использовать JAXR для доступа к ней.

Регистрации становятся все более важной частью сетевых служб, потому что они позволяют предприятиям динамично сотрудничать в свободной взаимовыгодной форме. Соответственно потребность в JAXR, который предоставляет предприятиям доступ к стандартным регистрационным формам с помощью Java, также возрастает.

Использование JAXR

В следующих главах приводятся примеры двух распространенных способов использования регистрационных форм. Это сделано для того, чтобы показать, как можно использовать возможности JAXR более полно.

Регистрация организации

Организация, использующая Java платформу для электронных сделок, может использовать JAXR для регистрации в стандартной регистрационной форме. Она должна ввести свое имя, описание и несколько определяющих принципов для облегчения поиска. Это проиллюстрировано на примере, который сначала создает RegistryServise объект rs и затем использует его для создания BusinessLifeCycleManager объекта lcm. Сеть кафе The Coffee Break, обозначена с помощью Organization объекта org, которому компания The Coffee Break присваивает свое имя, описание и свое положение в NAICS (the North American Industry Classification System – промышленная классификационная система Северной Америки). После этого элемент org, содержащий свойства и классификацию для The Coffee Break, добавляется в объект Collection orgs. В конечном счете, orgs сохраняется с помощью lcm, который будет управлять объектами Organization, заключенными в orgs.

Поиск регистрационных форм

Компания может использовать JAXR для поиска других компаний. Ниже приведенный пример использует BusinessQueryManager объект bqm для поиска компании The Coffee Break. Перед тем как bqm сможет вызвать метод findOrganizations, программа должна определить критерии поиска. В данном случае для поиска используются три из шести возможных параметров, так как третий, пятый и шестой параметры имеют значение null, а потому не накладывают ограничений на поиск. Первый, второй и четвертый параметры являются Collection объектами, с определенными параметрами findQualifiers и namePatterns. Единственный элемент в findQualifiers – это String, указывающий, что не следует выводить организацию, если ее название не удовлетворяет с учетом регистра одному из названий, указанных в namePatterns. Этот параметр, также являющийся Collection объектом с одним элементом, определяет, что мы ищем компанию, название которой содержит слово «Coffee». Другой Collection объект – это classifications, который был определен при регистрации The Coffee Break. Регистрация классификаций была проиллюстрирована в предыдущем примере, в котором была произведена регистрация The Coffee Break.

JAXR также поддерживает запросы SQL при поиске регистрации. Как показывает следующий фрагмент, это делается с помощью объекта DeclarativeQueryManager.

Объект response2 типа BulkResponse содержит значение id (uuid) для каждого вхождения в RegistyEntry, содержащего слово «Coffee» в своем названии.

Чтобы обеспечить внутреннюю связь между JAXP клиентом и регистрационной программой, отсылка сообщений производится с помощью JASM. Это полностью делается внутри сценариев так, что пользователь JAXR не видит этого механизма.

JAX-RPC


Краткий обзор

Java TM API для XML-based RPC (JAX-RPC) дает возможность писать Java приложения, использующие XML для выполнения удаленного вызова процедур (RPC – Remote Procedure Call).

Язык программирования Java уже имеет два других API для создания процедур удаленного вызова: Java IDL и Remote Method Invocation (RMI). Все три возможности имеют API для размещения и демаршализации аргументов, а также для передачи их процедурам. Различие состоит в том, что JAX-RPC основан на XML, что является более удобным для сетевых служб. Java IDL основан на COBRA (Common Object Request Broker Architecture) и использует OMG IDL (Object Management Group’s Interface Definition Language). RMI основан на RPC, при котором и вызывающий и вызываемый методы должны быть написаны на языке Java, впрочем, с RMI через IIOP вызываемая процедура может быть написана на ином языке. Sun планирует продолжать поддержку технологий COBRA и RMI и развивать технологию JAX-RPC, поскольку каждый из этих сервисов имеет свое назначение и свой круг пользователей.

Все разновидности RPC достаточно сложны, и включают в себя отображение и обратное отображение типов данных, а так же размещение и демаршализацию аргументов. Однако это происходит внутри сценариев и незаметно для пользователя. JAX-RPC продолжает эту модель, и клиенту, использующему XML-based RPC из языка программирования Java, не нужно работать с XML или осуществлять какое-либо отображение напрямую.

Использование JAX-RPC

JAX-RPC упрощает использование сетевых служб, а также их разработку, особенно при использовании J2EE платформы. Основанные на RCP сетевые службы, по существу, являются набором процедур, которые могут быть вызваны удаленным клиентом через Интернет. В свою очередь служба представляет собой серверное приложение, расположенное на сервере среди доступных клиенту процедур. Например, распространенный RPC Web-сервис stock quote, который через SOAP получает запрос на цену наличного товара и возвращает ее, также используя SOAP.

Сетевая служба должна быть доступна потенциальным клиентам, что может быть достигнуто, к примеру, с помощью WSDL (Web Services Description Language). После этого пользователь (Web-клиент) может осуществить поиск WSDL документа и получить доступ к сервису. Пользователь, использующий Java, задействует JAX-RPC, для того чтобы послать запрос службе, основанной на Java платформе, которая может быть или не быть определенной. Связь возможна и в том случае, если клиент, использующий другую платформу, запрашивает службу, основанную на платформе Java.

Хотя JAX-RPC использует SOAP для вызова удаленных процедур, пользователь JAX-RPC не видит этих технических деталей. Таким образом, изнутри, JAX-RPC, на самом деле представляет собой специализированную форму SOAP протокола, в отличие от JAXM, который является более устойчивой формой протокола SOAP, предоставляя разработчику все возможности. Это особенно заметно, когда протокол более высокого уровня, такой как ebXML, наложен на SOAP.

Вот список возможностей JAXM, которые JAX-RPC, вообще говоря, не поддерживает:

Маршрутизация сообщений для нескольких адресатов

Отправка сообщений с гарантированной доставкой

JAX-RPC предпочтителен для тех случаев, когда требуется избежать сложности работы с SOAP, и когда связь через RPC модель является достаточной. Важно заметить, что независимо от того, что используется, JASM или JAX-RPC, с помощью Java можно удобно работать с сообщениями в формате XML.

Пример сценария


Краткий обзор

Следующий сценарий демонстрирует использование Java API для XML, а так же их совместную работу. Достоинство Java APIs для XML состоит в том, что во многих случаях они предоставляют альтернативные пути, позволяя, таким образом, приспособить приложение для каких-либо конкретных нужд. Эта часть содержит несколько примеров, в которых можно несколькими способами достигать одних и тех же целей, обращая внимание на достоинства и недостатки каждого из них.

Сценарий

Предположим, что хозяин сети кафе The Coffee Break желает расширить число продаваемых им сортов кофе. Он дает задание своему менеджеру найти новых поставщиков и получить их прайс-листы. Компания сможет изучить цены и принять решение о сотрудничестве с некоторыми из них. Менеджер передает распоряжение инженеру по программному обеспечению, который в свою очередь решает использовать для этой цели поиск с помощью регистрационной формы ebXML, в которой The Coffee Break уже зарегистрирована.

Инженер пользуется JAXR, чтобы запросить оптовых поставщиков кофе. JAXR отсылает сообщения при помощи JAXM, который гарантирует отправление и распознавание запроса.

Регистрационная книга ebXML получает запрос и запускает JAXR-код с полученными параметрами для анализа зарегистрированных организаций. По завершению поиска регистрационная книга возвращает список оптовых поставщиков кофе.

Следующий шаг инженера – запросить с помощью JAXM у каждого из поставщиков прайс-лист с ценами на кофе. Она пишет программу, которая соединяется со службами приема-отправки сообщений, таким образом, получая возможность сделать запрос. Затем она создает JAXM-сообщение, добавляет запрос и отправляет его.

Каждый поставщик получает запрос, и перед тем как отправить текущий прайс, он вызывает с помощью JAX-RPC сервис stock quotes, чтобы получить последние цены на имеющийся в наличии товар, предназначенный для крупных сделок. Получив ответ, он посылает самые последние ценовые обновления TheCoffee Break в XML формате. Оптовые фирмы используют формат XML, потому что он удобен для них и их клиенты могут работать с ним, даже если они используют различные информационные системы.

Сравнение цен и заказ кофе

Инженер решает использовать JAXB для анализа прайс-листов. Список поставщиков, возвращенный регистрационной книгой, содержит информацию о DTD поставщиках, и что удобно, все они используют стандартную форму прайс-листа. Благодаря единому DTD оптовых компаний инженер может построить набор классов из этого DTD. (Иначе, она могла бы использовать для этой цели SAX или DOM.) Ее программа будет рассматривать каждый сорт кофе как объект, обладающий параметрами name и price. После инициализации классов, программа берет цены из объекта Coffee и сравнивает цены разных компаний.

Когда владелец и менеджер The Coffee Break, выберут поставщика, основываясь на работе, проделанной инженером, они будут готовы послать заказ. При помощи JAXB инженер создает новую XML форму заказа, основанную на классах, построенных из DTD прайс-листа. Эта форма, содержащая лишь те сорта кофе, которые владелец желает приобрести, будет отправлена поставщикам через JAXM. Каждая компания вышлет уведомление о получении заказа также через JAXM.

Продажа кофе через Интернет

Между тем, The Coffee Break готовится расширить количество сортов продаваемого кофе. Это потребует переделать их прайс-лист в HTML формат для сайта компании. Но перед этим надо будет определить, что опубликовывать. Инженер использует все те же объекты, которые она создала для сравнения цен и составления формы оптового заказа, для того чтобы взять каждую из цен и повысить ее на 25%, дабы получить цену, по которой The Coffee Break будет продавать свою продукцию. После некоторых преобразований прайс-лист превратится в он-лайн документ.

Из объектов, содержащих новые цены, инженер может, используя JavaServer Pages TM (JSP TM ), создать HTML — форму для заказа кофе он-лайн. Инженер получает объекты из JSP страницы и включает название и цену каждого из сортов в HTML таблицу на JSP странице. Покупатель водит количество нужного сорта кофе, и нажимает Submit, посылая заказ.

Заключение

Хотя, для краткости данный сценарий упрощен, он иллюстрирует, как глубоко XML технологии проникают в мир сетевых служб. И теперь, с появлением Java API для XML и J2EE платформы, становится значительно проще использовать Web-службы и писать для них программы.

Глоссарий

Asynchronous Асинхронный, слабо связанный, происходящий в разное время. При асинхронной передаче сообщений, отсылается сообщение, а ответ приходит позже при отдельной операции. См. synchronous.

B2B (Business-to-Business) Термин, используемый для описания сетевых взаимодействий между двумя организациями, например, оптовым поставщиком и розничным магазином.

B2C (Business-to-customer) Термин, используемый для описания сетевых взаимодействий между организацией и конечным потребителем, например, между магазином и розничным покупателем.

DOM (Document Object Model) Стандартный API для анализа XML данных, для представления их в виде дерева объектов и обработки содержимого этого дерева. Эта модель разработана консорциумом W3C. JAXP предоставляет интерфейс программирования на языке Java для API этой модели и позволяет приложению включать совместимый DOM анализатор.

DTD (Document Type Definition) Формальное определение шаблона, описывающего вид информации в отдельном XML-документе.

ebXML (Electronic Business XML) XML для электронного бизнеса. Открытая общественная инициатива, которая разрабатывает спецификации, нацеленные на создание единого глобального электронного рынка, основанного на использовании XML и Internet.

HTML (HyperText Markup Language) Язык разметки, используемый для форматирования Web страниц.

HTTP (HyperText Transfer Protocol) Протокол передачи данных в Internet.

J2EE TM (Java TM 2 Platform, Enterprise Edition) Java 2, редакция для предприятий. Инструментальный комплекс Java, определяющий стандарты многоуровневой обработки данных предприятия. Комплекс J2EE включает платформу J2SE.

J2SE TM (Java TM 2 Platform, Standard Edition) Java 2, стандартное издание. Инструментальный комплекс Java для клиентских вычислений.

JAX Pack Развивающийся набор API языка Java, связанный с XML (JAXP, JAXB, JAXM, JAXR и JAX-RPC). Этот набор будет включен в набор приложений Web Services Pack.

JAXB (Java TM Architecture for XML Binding) Архитектура для преобразования данных в XML документе в объекты языка программирования Java. Задавая шаблон XML документа (например, DTD), компилятор JAXB создаст классы, соответствующие этому DTD. Получившиеся классы содержат средства, позволяющие строить дерево объектов из XML данных, исходя из DTD, и формировать из этого дерева новый XML документ.

JAXM (Java TM API for XML Messaging) Стандартный API для отправки SOAP сообщений с применением языка Java. JAXM базируется на протоколе SOAP 1.1 в спецификации Attachments и предоставляет возможность использовать другие профили, например, ebXML или BizTalk, поверх себя.

JAXP (Java TM API for XML Messaging) Комплексный API для анализа и обработки XML документов. JAXP включает поддержку SAX, DOM, XSLT и пространства имен XML (XML Namespaces).

JAXR (Java TM API for XML Registries) Стандартный API для удобного доступа из среды Java к регистрационным формам предприятий в Internet.

JAX-RPC (Java TM API for XML RPC) Стандартный API для удаленного вызова процедур, основанных на XML с использованием языка программирования Java.


loosely coupled (слабосвязанный) Термин, относящийся к взаимодействию между двумя предприятиями, при котором каждое из них не осведомлено об информационной структуре другого предприятия и не зависит от нее.

OASIS (Organization for the Advancement of Structured Information Standards) Международная общественная организация, способствующая принятию взаимодействующих спецификаций открытых стандартов, например XML.

registry Web-служба, которая дает возможность для активного и свободного сотрудничества между организациями с помощью предоставления доступа к совместной информации. Эту службу иногда сравнивают с «желтыми страницами» электронной коммерции. См. repository

rerository Средство хранения данных, во многом схожее с базой данных. Деловая регистрация использует репозиторий для хранения своих данных, например, информации о деятельности, XML описаний определенных протоколов (например, RosettaNet PIP3A4 для заказов) и схем XML, определяющих структуру XML документов, полученных при обмене в течение поддерживаемого делового процесса.

schema Спецификация структуры множества XML документов. Пример: DTD.

SAX (Simple API for XML Parsing) Стандартный API, задающий основанный на событиях синтаксический анализатор XML. SAX разработан членами XML-DEV mail list, и в данный момент его развитием занимается OASIS standards body. JAXP предоставляет программируемый интерфейс Java для SAX API и позволяет приложениям подключать соответствующий анализатор SAX.

synchronous Тесно связанный, происходящий одновременно. Например, синхронизированные сообщения, после отправления подобного сообщения, ничего не будет происходить до получения ответа. Другими словами, сообщение и ответ тесно связаны. В JAXM API для отправки синхронных сообщений используется метод call. Он посылает сообщение и осуществляет блокировку вплоть до получения ответа.

SOAP (Simple Object Access Protocol) Простой протокол доступа к объектам. Основанный на XML протокол для доступа к сетевым сервисам и для их интеграции друг с другом.

UDDI (Universal Description, Discovery, and Integration) Универсальное описание, поиск и взаимодействие. Основанный на языке XML всемирный регистр Web-сервисов электронной коммерции.

web services Интернет службы. Сетевые службы распространяются в Интернет в произвольно связанном виде, используя XML интерфейс. Например, сервисы, основанные на JAX-RPC, представляют собой набор процедур, который можно вызвать с помощью удаленного клиента.

Web Service Pack Набор приложений, который пересылает ключевые технологии для упрощения построения сетевых служб при помощи платформы Java 2. Он включает в себя JavaServer Faces (стандартный API для создания Java Web GUIs), Tomcat (an open-source implementation of JavaServer Pages и Java Servlet technologies), и JAX Pack (узел Java APIs для XML).

WSDL (Web Services Description Language) Язык описания Web-сервисов. Основанный на XML язык, служащий для описания доступных через Интернет Web-сервисов.

WWW (World Wide Web) Всемирная паутина. Сеть систем и данных, называемая Интернет.

W3C (World Wide Web Consortium) WWW-консорциум. Организация, создающая и развивающая стандарты Web технологий для обеспечения возможности взаимодействия Web-языков и протоколов.

XML (eXtensible Markup Language) Расширяемый язык разметки, язык XML. Простой расширяемый язык для разметки текстовой информации. Благодаря его переносимости служит как универсальный базовый формат для обмена данными между приложениями, распределенных Web-служб и торговыми партнерами.

XML Namespaces Стандарт W3C для построения документов, связанных с несколькими DTD и содержащими совпадающие имена. Стандарт поддерживается JAXP-ом.

XSL (eXtensible Stylesheet Language) Расширяемый язык таблиц стилей, язык XSL. Язык XSL служит для описания преобразований XML-документов. Для преобразования XML документа, используя таблицу стилей приложения, применяют XSLT, являющийся расширением XSL.

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

dev64

Programming

Использование аннотаций с JAXB, генерация XML schema из java-кода

Галерея

Однажды, возникла необходимость настройки формата дат внутри XML документов. Работа с документами осуществлялась с помощью JAXB. Всвязи с этим коллеги нашли в интернете замечательную публикацию на сайте http://ooxs-be.goracer.nl/EN/java/Java%20and%20XML%20Binding.html

Ниже перевод не совсем близкий к тексту. Я слегка видоизменяю его для улучшения понимаемости. (По крайней мере мне хочется её улучшить). Если что-то не совсем понятно, смотрите оригинал.

Introduction

При работе с XML в Java, он может рассматриваться просто как текст, который должен быть прочитан изменен и куда-то записан. Т.о. это может быть сделано обычной конкатенацией строк или с помощью DOM-модели в памяти для доступа, создания или модификации документа.

В большинстве случаев, однако, кроме XML документа имеется набор классов — модель в виде beans или POJO, не важно как классы представлены и называются, но эти классы должны преобразовываться в XML документ и обратно из XML документа превращаться в набор классов. Это нужно для посылки этих классов в запросе на веб-сервис, для сохранения в файле и т.п.

Такая взаимосвязь модели Java объектов и XML представления документов называется англоговорящими программистами binding. Создание объектов из XML называется unmarshalling, а обратная операция генерации XML из Java объектов — marshalling.

Есть различные способы для реализации unmarshalling-а и marshalling-a:

  • Написать SAX парсер для создания Java объектов
  • Работать с DOM деревом для извлечения нужных объектов из него
  • Использовать специальный API такой как JAXB, Apache Commons Betwixt, и т.д.

Java Architecture for XML Binding (JAXB)

JAXB не только API. Существуют стандартные средства для генерации Java классов из XML schema (to form binding to XML), и для генерации XML schema из Java классов с расставленными аннотациями. Эти средства появились в Java как часть пакета JAXB.

Практический пример Java классов с JAXB аннотациями

Подходящий случай для использования JAXB — когда у вас имеется набор классов в приложении, которые вы хотите писать и читать в XML формате. Мы используем очень простой пример моделирования группы людей. У нас имеются два класса Group и People которые должны преобразовываться в XML и обратно. Дополнительно есть класс Application который и будет производить эти операции.

Преимущество JAXB в том, что в Java 6 мы используем стандартный API, ничего дополнительно не требуется устанавливать, конфигурировать и т.д.

Ниже корневой класс нашего XML документа, мы должны добавить аннотацию @XmlRootElement. propOrder = < «name», «members» >указывает в каком порядке элементы будут записываться в XML теги.

Подобным образом добавляем аннотации в дочерний класс

И, наконец, ниже класс Application выполняющий сериализацию (marshalling-unmarshalling) вышеприведенных классов с помощью JAXB:

Добавим код для генерации XML, и выполним приложение добавив в группу пару элементов для демонстрации JAXB API:

Благодаря аннотациям, лишь три строчки кода генерируют XML. (4 для лучшего форматирования для улучшения читаемости)

Однако в выходном XML есть ряд неожиданных элементов.
Каждый элемент Person помещён внутрь тега members вместо тега person. Это мы изменим позже. А пока посмотрим пример обратного преобразования. Сначала мы повторим предыдущий пример, создадим XML, потом запишем его в byte array. Затем сделаем unmarshalling из сгенерированного предварительно XML.

В результате теста дополнительно к XML получаем следующий output:

JAXB утилиты входят в стандартную инсталляцию Java. При установке Java 6 JDK они устанавливаются в каталог $JAVA_HOME/bin.
Например в дистрибутивах Linux подобных Ubuntu, они будут по умолчанию доступны для вызова из командной строки.

Генерация XML schema из Java-классов.

Чтобы JAXB утилиты стали доступны под Windows, нужно в переменных окружения указать путь к поддиректорию bin в каталоге с JDK. Для генерации XML schema из Java кода с добавленными аннотациями, используется утилита schemagen:

Допустим мы находимся в корневом директории исходников. Т.е. в нём у нас подкаталог be/ooxs/example/jaxb/ с исходниками:
Group.java, Person.java, Application.java

Тогда находясь в директории с исходниками мы генерируем XML схему такой командой (я тестируюсь под Windows):

  • -d . задает, что схема будет положена в текущий директорий
  • -cp . — classpath. Корневой директорий наших исходников. Т.к. мы в нём и находимся. То указываем точку.
  • третий параметр — путь к .java — файлу с исходным кодом корневого элемента нашего XML документа.

В итоге будет получен схема файл, который вы можете использовать по мере необходимости. Заметьте, что порядок элементов lastName, firstName, birthDate как определено в аннотациях.

Модифицируем аннотации

Для получения слегка улучшенной XML структуры, добавим несколько вещей:

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

В результате при повторении теста получим XML:

Java Language Анализ XML с использованием API JAXP

замечания

XML Parsing — это интерпретация XML-документов, чтобы манипулировать их контентом с помощью разумных конструкций, будь то «узлы», «атрибуты», «документы», «пространства имен» или события, связанные с этими конструкциями.

Java имеет собственный API для обработки документов XML, называемый JAXP или Java API для обработки XML . JAXP и эталонная реализация были включены в каждую версию Java после Java 1.4 (JAXP v1.1) и с тех пор развиваются. Java 8 поставляется с JAXP версии 1.6.

API предоставляет различные способы взаимодействия с XML-документами, которые:

  • Интерфейс DOM (Document Object Model)
  • Интерфейс SAX (простой API для XML)
  • Интерфейс StAX (Streaming API для XML)

Принципы интерфейса DOM

Интерфейс DOM предназначен для предоставления W3C DOM- совместимого способа интерпретации XML. Различные версии JAXP поддерживают различные спецификации DOM (до уровня 3).

В интерфейсе Document Object Model документ XML представлен как дерево, начиная с «Элемента документа». Базовый типом API является Node типа, это позволяет перемещаться от Node к его родителям, его детям, или его братьям (хотя, не все Node с может иметь детей, например, Text узлы являются окончательными в дереве, и никогда не имеют детей). Теги XML представлены как Element s, которые значительно расширяют Node с помощью связанных с атрибутами методов.

Интерфейс DOM очень полезен, поскольку он позволяет «одну строку» анализировать XML-документы как деревья и позволяет легко модифицировать построенное дерево (добавление узла, подавление, копирование и т. Д.) И, наконец, его сериализацию (обратно на диск ) после изменений. Это происходит по цене, однако: дерево находится в памяти, поэтому деревья DOM не всегда практичны для огромных XML-документов. Кроме того, построение дерева не всегда является самым быстрым способом работы с XML-контентом, особенно если его не интересуют все части документа XML.

Принципы интерфейса SAX

SAX API — это ориентированный на события API для работы с документами XML. В рамках этой модели компоненты XML-документов интерпретируются как события (например, «открыт тег», «тег закрыт», «встречен текстовый узел», «был встречен комментарий»). ..

API SAX использует подход «синтаксический разбор», где SAX Parser отвечает за интерпретацию XML-документа и вызывает методы для делегата ( ContentHandler ) для обработки любого события, которое встречается в документе XML. Обычно один никогда не пишет парсер, но один обеспечивает обработчик для сбора всей необходимой информации из XML-документа.

Интерфейс SAX преодолевает ограничения интерфейса DOM, сохраняя только минимально необходимые данные на уровне анализатора (например, контексты пространств имен, состояние проверки), поэтому только информация, ContentHandler для которой вы, разработчик, несет ответственность, — это хранится в памяти. Компромисс заключается в том, что при таком подходе нет возможности «вернуться во времени / XML-документ»: в то время как DOM позволяет Node возвращаться к его родительскому объекту, такой возможности нет в SAX.

Принципы интерфейса StAX

API StAX использует аналогичный подход для обработки XML как API SAX (т. Е. Управляемый событиями), единственное очень существенное отличие состоит в том, что StAX является синтаксическим анализатором (где SAX был парсером push). В SAX Parser находится под контролем и использует обратные вызовы в ContentHandler . В Stax вы вызываете парсер и управляете, когда / если вы хотите получить следующее «событие» XML.

API начинается с XMLStreamReader (или XMLEventReader ), которые являются шлюзами, через которые разработчик может спросить nextEvent() в стиле итератора.

Есть ли более простой способ анализа XML в Java?

Я пытаюсь понять, как разбирать некоторые XML (для Android-приложения), и кажется довольно смешным, как трудно это сделать на Java. Похоже, для этого требуется создание обработчика XML, который имеет различные обратные вызовы (startElement, endElement и т.д.), И вы должны затем позаботиться об изменении всех этих данных на объекты. Что-то вроде этот учебник.

Все, что мне действительно нужно, — это изменить XML-документ в многомерный массив, и даже лучше будет иметь какой-то Hpricot процессор. Есть ли способ сделать это, или мне действительно нужно написать весь дополнительный код в приведенном выше примере?

Существует два разных типа процессоров для XML в Java (фактически, но один из них странный). У вас есть парсер SAX и то, что вы хотите, это парсер DOM. Посмотрите http://www.mkyong.com/java/how-to-read-xml-file-in-java-dom-parser/на использование парсера DOM. DOM создаст дерево, которое можно легко перемещаться. SAX лучше всего подходит для больших документов, но DOM намного проще, если медленнее и интенсивнее.

Попробуйте http://simple.sourceforge.net, его XML-сериализацию и привязку к Java, полностью совместимую с Android и очень легкую, 270K и без зависимостей.

Ознакомьтесь с этой статьей для способов обработки XML на Android. Возможно, стиль DOM или XML Pull подходит вашему стилю лучше

(Прошу извинить природу самопомощи этого поста. Я работаю над этой библиотекой в ​​течение нескольких месяцев, и все это с открытым исходным кодом /Apache 2, так что это не самообслуживание, а просто пытается помочь).

Я только что выпустил библиотеку, которую я вызываю SJXP или «Простой Java XML Parser», http://www.thebuzzmedia.com/software/simple-java-xml-parser-sjxp/

Это очень маленький/плотный (4 класса) слой абстракции, который находится поверх любого совместимого с производительностью XML Pull Parser.

На платформах Android и не-Android Java вытягивание разбора, вероятно, является одним из самых эффективных (как в скорости, так и при низкой памяти) методах разбора. К сожалению, кодирование непосредственно против синтаксического анализатора выглядит так же, как любой другой XML-синтаксический код (например, SAX) — у вас есть обработчики исключений, поддерживающие состояние анализатора, проверка ошибок, обработка событий, разбор значений и т.д.

Что делает SJXP, это позволяет вам определять «пути» в стиле XPath в документе элементов или атрибутов, из которых вы хотите получить значения, например:

и он вызовет ваш обратный вызов со значением, когда это правило будет соответствовать. API действительно прямолинейный и имеет интуитивную поддержку для элементов, имеющих отношение к пространству имен, если это то, что вы пытаетесь проанализировать.

Код для стандартного анализатора будет выглядеть примерно так (пример, который анализирует заголовок RSS2):

то вы просто создаете экземпляр XMLParser и даете ему все правила, о которых вы хотите его заботиться:

И что он, парсер будет вызывать метод обработчика каждый раз, когда правило будет соответствовать. Вы можете прекратить разбор в любое время, вызвав parser.stop(), если хотите.

Кроме того (и это реальный выигрыш в этой библиотеке) сопоставление элементов и атрибутов пространства имен невозможен, вы просто добавляете свой URI пространства имен внутри скобок, префиксного имени элемента на вашем пути.

В качестве примера скажем, что вы хотите получить элемент для RSS-канала, чтобы вы могли указать, на каком языке он находится (ссылка: http://web.resource.org/rss/1.0/modules/dc/). Вы просто используете уникальный URI пространства имен для этого элемента «language» с префиксом «dc», а путь к правилам выглядит следующим образом:

То же самое относится и к атрибутам с атрибутом имен.

При всей этой простоте единственные накладные расходы, которые вы добавляете к процессу синтаксического анализа, — это поиск хэша O (1) в каждом месте документа XML и несколько сотен байтов, возможно, 1k для внутреннего местоположения анализатора.

Библиотека работает на Android без каких-либо дополнительных зависимостей (поскольку платформа уже предоставляет org.xmlpull impl) и в любой другой среде выполнения Java, добавляя зависимость XPP3.

Эта библиотека является результатом многомесячного написания пользовательских синтаксических парсеров для каждого вида XML-фида на каждом языке и реализации (с течением времени) того, что около 90% парсинга можно отделить от этой действительно базовой парадигмы.

XML документ — DOM, SAXParser

Существуют две стратегии обработки XML документов: DOM (Document Object Model) и SAX (Simple API for XML). Основное их отличие связано с тем, что использование DOM позволяет читать и вносить изменения в существующий XML-документ, а также создавать новый. Стратегия использования SAX основывается на том, что содержимое XML-документа только анализируется. XML-текст может быть больших размеров: DOM должен весь документ «заглотить» и проанализировать, а SAX-парсер обрабатывает XML-документ последовательно и не требует дополнительной памяти.

Для работы с XML-файлами Java располагает достаточно большим набором инструментов, начиная от встроенных возможностей, которые предоставляет Core Java, и заканчивая большим набором разнообразного стороннего кода, оформленного в виде библиотек. Сначала рассмотрим использование DOM для чтения XML-файла и создания нового файла/документа. А в заключение будет приведено описание и применение SAX-парсера SAXParser.

XML документ представляет собой набор узлов (тегов). Каждый узел может иметь неограниченное количество дочерних узлов, которые, в свою очередь, также могут содержать потомков или не содержать их совсем. Таким образом строится дерево объектов. DOM — это объектная модель документа, которая представляет собой это дерево в виде специальных объектов/узлов org.w3c.dom.Node. Каждый узел Node соответствует своему XML-тегу и содержит полную информацию о том, что это за тег, какие он имеет атрибуты, какие дочерние узлы содержит внутри себя и т.д. На самой вершине этой иерархии находится org.w3c.dom.Document, который является корневым элементов дерева.

Чтение XML-файла

Получить объект Document XML-файла можно следующим образом :

Чтобы найти какой-либо узел в дереве можно использовать метод getElementsByTagName, который возвращает список всех элементов :

Метод getElementsByTagName является case-sensitive, т.е. различает прописные и строчные символы.

В цикле можно просмотреть все дочерние узлы. C помощью метода getAttributes можно узнать атрибуты узла. Метод getNodeType позволяет проверить тип узла :

Создание XML-файла

Для создания нового объекта Document используйте следующий код :

Элемент Element объекта Document создается с использованием метода createElement. Для определения значения элемента следует использовать метод setTextContent. Для добавления элемента в узловую запись используйте метод appendChild (Node). Элемент может содержать атрибуты. Чтобы добавить к элементу атрибут следует использовать метод setAttribute. Если элемент уже содержит атрибут, то его значение изменится.

В результате работы примера будет создан Document следующей структуры :

Пример чтения и создания XML-файла

Для чтения готового XML-файла и формирования нового файла создадим в IDE Eclipse простой проект XMLSample, структура которого представлена на следующем скриншоте.

Проект включает XML-файл «posts.xml» с исходными данными, создаваемый XML-файл данных «data.xml», класс Post.java, в который будут упаковываться отдельные записи массива данных и основной класс проекта XMLSample, который будет производить все необходимые действия.

Структура XML-файла

В качестве исходных данных используется XML-файл «posts.xml» из примеров разработчиков Sencha GXT 3.1.1. Структура XML-данных содержит корневой элемент и набор объектов/сущностей, представленных тегами .

Листинг класса Person

Класс Person имеет несколько полей. Идентификатор записи id определяется при создании объекта в конструкторе. Методы set/get не представлены в листинге.

Чтение XML-файла

Для чтения XML-файла в проекте используется метод readDataXML(), который создает список persons типа List

, читает XML-файл данных и формирует объект doc типа Document. После этого в цикле создается массив данных. Вспомогательная функция getValue извлекает текст атрибута записи.

Следует обратить внимание, что для чтения значения атрибута записи (объекта Person) сначала получаем ссылку на массив тегов , и после этого по индексу в функции getValue извлекаем значение.

Создание XML-файла

Для создания нового XML-файла на основе массива posts подготовим два списка данных типа List : пользователей users и форумов forums. Эти два массива запишем в XML-файл.

Создание нового объекта Document и сохранение его в XML-файл в проекте выполняет метод writeDataXML :

Листинг метода создания XML-файла

Процедура сохранения объекта Document в XML-файл представлена отдельным методом writeDocument :

Листинг процедуры сохранения XML-файла

Если массив posts окажется пустым, то новый XML-файл должен будет иметь следующий вид :

SAX-парсер, SAXParser

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

Рассмотрим пример SAXExample.java с использованием класса SAXParser для анализа XML-текста, представленного файлом phonebook.xml, содержащего 3 записи и имеющего следующий вид :

Файл phonebook.xml

Пакеты «javax.xml.parsers» и «org.xml.sax» включают набор классов для «разбора» XML в строковом представлении. К основным классам этих пакетов, с точки зрения разложения XML объекта на составляющие, относятся SAXParser и DefaultHandler.

В примере SAXExample.java создается класс handler типа DefaultHandler, в котором методы анализа XML-строки переопределяются. Все прозрачно.

Листинг SAXExample.java

В результате выполнения примера использования SAXParser в консоль будут выведены следующие сообщения :

Скачать примеры

Рассмотренные на странице примеры использования DOM для чтения и создания XML-документа, применения SAXParser’а для анализа XML-текста в виде проекта Eclipse можно скачать здесь (133 Кб).

Илон Маск рекомендует:  Iis глобальные записи реестра
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL