В основе реализации подходов современного развития открытых технологий создания, хранения и использования информационных ресурсов [1] лежат следующие основные положения:
1. Унификация описания и создания информационных ресурсов на основе локализованных версий международных спецификаций и стандартов.
2. Централизация хранения на основе создания хранилищ информационных ресурсов федерального уровня.
3. Унификация использования на основе, как программных средств общего пользования, так и специализированных, но открыто опубликованных для единообразного использования.
В данной работе рассматривается подход в практическом аспекте реализации данных требований, - как реализация сервлета, с помощью которого обрабатывается файл метаданных (metadata.xml) [2], содержащийся в архиве, не распаковывая файл ZIP в папку на диске. Задача сервлета - выбирать из него содержимое некоторых элементов, имя которых содержит префикс пространства имён, и вывести их содержимое пользователю.
В классе сервлета реализованы методы [3], отвечающие:
· за загрузку архива с метаданными на сервер;
· вывод файла *.xml в поток;
· обработку xml;
· вывод результатов пользователю.
Рассмотрим тонкости реализации каждого из них:
1. Для загрузки архива на сервер используется библиотека commons-fileupload-1.0.jar. Для передачи файла создаем поток класса DiskFileUpload и получаем данные из HTTP-запроса сервлета. DiskFileUpload upload = new DiskFileUpload(); …
List<FileItem> list = upload.parseRequest(httpServletRequest).
2. Библиотека ввода/вывода Java содержит классы, поддерживающие чтение и запись потоков в компрессированном формате (ZipInputStream, ZipOutputStream). Для извлечения файлов ZipInputStream используется метод getNextEntry( ), который возвращает следующий ZipEntry, если он существует. В качестве более краткой альтернативы, можно читать файл, используя объект ZipFile, который имеет метод entries(), возвращающий Enumeration из ZipEntries.
ZipInputStream zis = new ZipInputStream(actualFile.getInputStream());
ZipEntry entry = zis.getNextEntry();
while (!filename) {
entry = zipInputStream.getNextEntry();
if (entry == null) {
break;
}
3. Парсер (parser − программа синтаксического анализа, парсинга) для XML часто является ключевым элементом в обеспечении устойчивости и производительности приложения [4]. К традиционным методам парсинга XML относятся − Document Object Model (DOM) и Simple API для XML (SAX). Во многом они расходятся. DOM предоставляет для XML-документов простую объектную модель. DOM-парсер превращает XML-документ в несложный объект, который представляет все данные из XML-документа. Но DOM-парсинг очень требователен к ресурсам памяти. Для SAX проблема с памятью отсутствует. SAX-парсеры производят серию событий анализа [5]. Обработчик (handler) может регистрировать обратные вызовы (callbacks) для этих событий и затем применять определенную логику к данным, связанным с этими событиями. SAX работает быстро и эффективно, но нуждается в более сложной программной модели. Для реализации парсинга был выбран Xerces, поддерживающий SAX второго поколения, позволяющий корректно обрабатывать пространство имен [6].
//создаем парсер
XMLReader parser = XMLReaderFactory.createXMLReader(PARS_NAME);
parser.setContentHandler(parhandler);
// создаем XPath
XPath xpath = XPathFactory.newInstance().newXPath();
// expression – запрос XPath на выборку нужных элементов
parser.parse(xpath.evaluate(expression, entry));
Событие startElement()
происходит, когда парсер SAX нашел тег начала для элемента. Это событие имеет четыре параметра:
- String uri
- URI пространства имен.
- String localName
- квалифицированное имя элемента.
- String qualifiedName - к
валифицированное название элемента. Это префикс пространства имен, соединенный с локальным названием элемента.
- org.xml.sax.Attributes attributes
- объект, содержащий все атрибуты для этого элемента. Этот объект предоставляет несколько методов для получения имён и значений атрибутов, а также количество атрибутов, которые данный элемент имеет [7].
4. В событии startElement пишется вывод найденных данных пользователю.
System.out.println("<br>");
System.out.print(attrs.getValue(i));
System
.
out
.
println
("<
br
>");
Методы сервлета выполняются поочередно и по завершению пользователь получает на экран найденные данные, если таковые есть [8].
архив: 2013 2012 2011 1999-2011 новости ИТ гость портала 2013 тема недели 2013 поздравления