Java XML API: выбираем правильно. StAX: работаем с удовольствием
в 60% проектов и посвятил ей занятие своей стажировки Masterjava. Наиболее частые его применения: XHTML, SOAP, различные конфигурации (например Tomcat, SoapUI, IntelliJ IDEA, Spring XML конфигурация), импорт-экспорт данных.
В Java есть несколько API для работы с XML и для разработчика важно понимать, какое из API требуется выбрать в каждой конкретной ситуации. В этой статье я кратко перечислю все Java XML API, их назначение и примеры использования, и подробнее остановлюсь на работе с достаточно редкой, но в ряде случаев единственно верной технологией StAX. Предполагается что с элементами XML вы уже знакомы.
Java XML API: выбираем правильно
StAX: работаем с удовольствием
Прежде всего хочу отметить, что со StAX можно работать через 2 API: низкоуровневое XMLStreamReader, возвращающая примитивы и высокоуровневое XMLEventReader, которое возвращает объекты и расходует больше памяти. Далее я буду работать с XMLStreamReader. Сделав над ним обертку работа с XML будет простой и удобной.Разберем небольшой пример: есть простой XML с городами и юзерами:В реальности этот XML может содержать сотни городов и сотни тысяч / миллионы юзеров. Все, что требуется: распечатать список городов. В данном случае StAX API — единственно верный выбор. Добавляем в проект вспомогательный класс StaxStreamProcessor :Далее мы последовательно идем по XML, считываем все интересные нам события и выводим требуемую информацию:Чтобы постоянно не дублировать в программе часто повторяющийся код поиска нужного события в XML, мы можем добавить его в StaxStreamProcessor :Пользоваться утильным классом станет не просто, а очень просто:Недостаток этого кода — мы совершенно бесполезно потратим ресурсы на прохождение по сотням тысяч ненужных нам юзеров вместо завершения программы. Нужно добавить условие прекращение сканирования XML. Обычно это конец тэга родительского элемента (в нашем случае Cities ). Добавляем в StaxStreamProcessor еще один утильный метод, который сканирует XML либо до конца тэга родителя, либо до заданного элемента:Добавим методы чтения атрибута и текста:Код вызова останется суперпростым и мы прекратим обработку XML сразу после конца тега Cities :StAX API требует аккуратность при чтении событий. Если в выводе мы помяняем местами чтение атрибута и текста, но код станет нерабочим: после прочтения из XML названия города атрибут останется позади и будет недоступен. Также следует помнить, что, в зависимости от текущего положения XML, нам доступны одни методы API чтения из XML и недоступны другие.Используя startElement можно добираться до элементов XML любой степени вложенности и, по мере необходимости, дополнять StaxStreamProcessor другими утильными методами. Надеюсь что с данным подходом работа с StAX покажется вам легкой и удобной.
XML API¶
Обзор¶
Документация включает описание API для отправки SMS-сообщений через платформу Devino Telecom с примерами запросов. API включает в себя возможность как транзакционных, так и массовых рассылок, получение подробной статистики по рассылкам. Документ предназначен для разработчиков, которые хотят добавить возможность взаимодействия с Сервисом отправки SMS-сообщений на страницы своих сайтов или в свои приложения. Общение с сервисом осуществляется при помощи отправки XML запросов в кодировке UTF-8 на заданный адрес сервиса по протоколу HTTPS методом POST, проверка типа контента не осуществляется. Каждый запрос может состоять из отправляемых сообщений и (или) запросов для получения статусов и (или) запросов для получения входящих сообщений. Авторизация пользователя происходит путем передачи учетных сведений в теге package, обязательна при выполнении любых запросов.
Сервис доступен по адресу:
Отправка сообщений¶
Отправка сообщений осуществляется в соответствии с очередностью по получению сообщений и временем отправки.
| Параметр | Тип данных | Обязательный | Описание |
|---|---|---|---|
| Default | Нет | Тег, в котором определяются общие атрибуты, указываемые для всех отправляемых сообщений. Если какой-либо атрибут указан в сообщении, то атрибут данного тега игнорируется | |
| msg | да | Тег сообщения, в качестве параметра указывается текст отправляемого сообщения | |
| id | integer | Нет | Пользовательский числовой идентификатор сообщения |
| recipient | varchar(21) | Да | Номер телефона. Пример: 79031234567, +79031234567 |
| sender | varchar(11) | Да | Адрес отправителя |
| date_beg | datetime, ISO8601 | Нет | Дата отправки сообщения, указывается для отложенной отправки сообщений. |
| date_end | datetime, ISO8601 | Нет | Дата, после которой сообщение теряет актуальность и если оно еще не было отправлено абоненту, отправляться не будет. |
| url | varchar(100) | Да * | Ссылка для создания wap-push сообщения |
| type | integer | Да | Тип сообщения: 0-обычное сообщение 1-flash сообщение 2-wap-push сообщение |
На полученный запрос сервис возвращает в виде параметра статус сообщения, а в атрибутах идентификаторы, присвоенные сообщениям.
| Параметр | Тип данных | Описание |
|---|---|---|
| msg | Тег сообщения, в качестве параметра возвращается код статуса | |
| id | integer | Пользовательский числовой идентификатор сообщения, необязательный атрибут, возвращается при указании данного атрибута в запросе |
| sms_id | integer | Числовой идентификатор сообщения, присвоенный шлюзом |
| sms_count | integer | Реальное количество SMS к отправке |
Запрос статусов сообщений¶
Статусы сообщений содержат информацию о текущем состоянии сообщения, регулярно обновляются и могут быть запрошены пользователем в любое время. Статусы можно запрашивать за последние 3 календарных дня. Максимальное количество ID в запросе 1000.
| Параметр | Тип данных | Обязательный | Описание |
|---|---|---|---|
| msg | Нет | Тег сообщения, для которого происходит запрос статуса | |
| id | integer | Нет * | Пользовательский числовой идентификатор сообщения, возвращается при указании данного атрибута в запросе |
| sms_id | integer | Да * | Числовой идентификатор сообщения, присвоенный шлюзом |
* Можно указать любой из этих параметров
В ответ на запрос возвращается XML документ содержащий статусы для запрошенных сообщений, либо соответствующие коды ошибок.
| Параметр | Тип данных | Описание |
|---|---|---|
| msg | Тег сообщения, для которого происходит запрос статуса, в качестве параметра возвращается код статуса | |
| id | integer | Пользовательский числовой идентификатор сообщения, возвращается при указании данного атрибута в запросе |
| sms_id | integer | Числовой идентификатор сообщения, присвоенный шлюзом |
| sms_count | integer | Реальное количество SMS к отправке |
| date_completed | datetime, ISO8601 | Дата присвоения финального статуса |
Коды статусов документа¶
При отправке XML документа могут возвращаться следующие коды ошибок:
| Код | HTTP Status | Расшифровка |
|---|---|---|
| ERR_UNKNOWN | 200 | Неизвестная ошибка |
| ERR_FORMAT | 201 | Неправильный формат документа |
| ERR_AUTHORIZATION | 202 | Ошибка авторизации |
Коды статусов сообщений
Данные коды используются при возврате статусов сообщений.
Понимание XML
Узнайте, как Расширяемый язык разметки (Extensible Markup Language — XML) облегчает универсальный доступ к данным. XML — основанный на Unicode метаязык: язык для описания языков разметки. Он не привязан ни к одному языку программирования, операционной системе или поставщику программного обеспечения. XML обеспечивает доступ к огромному количеству технологий по манипулированию, структурированию, трансформированию и запрашиванию данных.
Введение
Расширяемый язык разметки (XML) изначально был задуман как язык для описания новых форматов документов World Wide Web. XML происходит от Стандартного обобщенного языка разметки (Standard Generalized Markup Language — SGML) и может считаться метаязыком: языком для определения языков разметки. SGML и XML — это ориентированные на текст форматы, которые обеспечивают механизмы описания структур документов с помощью тэгов разметки (слов, взятых в угловые скобки ‘ ’ ). Web-разработчики могут заметить некоторую схожесть между HTML и XML, обусловленную тем фактом, что они оба происходят от SGML.
Поскольку применение XML возросло, сейчас общепринято считать, что XML полезен не только при описании новых форматов документов для Web, но также подходит для описания структурированных данных. Примеры структурированных данных включают информацию, которая обычно содержится в крупноформатных таблицах, файлах конфигурации программы и сетевых протоколах.
XML является предпочтительным для существовавших ранее форматов данных, потому что XML может запросто представить и табличные данные (такие как реляционные данные из базы данных или больших таблиц), и псевдоструктурированные данные (такие как Web-страницы или деловые документы). Популярные ранние форматы, такие как файлы с разделяемыми запятой значениями (CSV), или подходят для табличных данных и плохо описывают псевдоструктурированные данные, или, как RTF, слишком специализированы для псевдоструктурированных текстовых документов. Это привело к широкому распространению XML как языка для обмена информацией.
XML везде
Кроме способности представлять и структурированные, и псевдоструктурированные данные, XML имеет несколько характеристик, которые обусловили его широкое использование в качестве формата представления данных. XML — расширяемый, плотформо-независимый и поддерживает локализацию, т.к. полностью совместим с Unicode. Тот факт, что XML — текстовый формат, означает, что при возникновении необходимости XML-документы можно читать и редактировать, используя стандартные инструменты редактирования текстов.
XML не привязан ни к одному языку программирования, операционной системе или поставщику программного обеспечения. Кстати, создавать или потреблять XML, используя различные языки программирования — слишком прямолинейно. Независимость от платформ делает XML очень полезным в качестве средства достижения возможности взаимодействовать между различными платформами программирования и операционными системами.
Синтаксис XML 1.0
Как было упомянуто ранее, рекомендация W3C XML 1.0 описывает текстовый формат для описания структурированных и псевдоструктурированных данных, используя синтаксис, подобный HTML.
Сравнение XML и HTML
И HTML, и XML документы состоят из элементов, каждый из которых включает «начальный тэг» ( ), «конечный тэг» ( ) и информацию, заключенную между этими двумя тэгами (которая называется содержимым элемента). Элементы могут быть аннотированы атрибутами, содержащими метаданные об элементе и его содержимом.
Однако между HTML и XML есть существенные отличия. XML чувствителен к регистру, в то время как HTML — нет. Это значит, что в XML начальные тэги
