Представляем MicroXML: Часть 2. Обработка MicroXML с помощью инструмента MicroLark

Эксперименты с новаторским MicroXML-парсером

MicroXML — это обратно-совместимое упрощение технологии XML. Первая статья в этом цикле охватывает базовые принципы MicroXML. Технология MicroXML обладает прямолинейной грамматикой, которая допускает обработку многими современными инструментами общего назначения для синтаксического анализа (парсерами). Джон Кован (John Cowan) разработал инструмент MicroLark, представляющий собой MicroXML-парсер с открытым исходным кодом для среды Java™. В этой статье приводится пример программного кода, позволяющий лучше изучить инструмент MicroLark.

Уче Огбуйи (Uche Ogbuji), главный консультант, Fourthought

Photo: Уче ОгбуйиУче Огбуйи (Uche Ogbuji) является консультантом и соучредителем корпорации Fourthought, которая занимается поставкой и консультационными услугами в области XML-решений для корпоративного управления знаниями. Корпорация Fourthought разрабатывает 4Suite, платформу с открытым исходным кодом для XML, RDF и приложений управления знаниями. Огбуйи также является ведущим разработчиком Versa - языка запросов RDF. Специалист по компьютерной технике и писатель, Огбуйи родился в Нигерии, в данной время проживает и работает в г. Боулдер, Колорадо, США. Связаться с ним можно по электронной почте uche@ogbuji.net.



31.10.2012

Обзор

Новая технология MicroXML — это обратно-совместимое упрощение технологии XML. В первой статье данного цикла под названием Базовые принципы MicroXML, были рассмотрены основы технологии MicroXML, а также ее отличия от спецификации XML 1.x и от соответствующих стандартов. Джеймс Кларк (James Clark) впервые предложил технологию MicroXML. Джон Кован (John Cowan) усовершенствовал ее, а также создал первый MicroXML-парсер под названием MicroLark. MicroLark — это написанный на языке Java инструмент с открытым исходным кодом (лицензия Apache 2.0), реализующий несколько режимов парсинга: pull mode, push mode и tree mode.

Данная статья посвящена синтаксическому анализу (парсингу) формата MicroXML. Различные аспекты API-интерфейса парсера MicroLark рассматриваются с использованием командной строки и примера программного кода.

Начало работы

Для выполнения примеров из этой статьи необходимо загрузить следующие компоненты(см. раздел Ресурсы):

  • microLark.jar или другой предпочтительный исходный код
  • интерпретатор с открытым исходным кодом Jython

Вы можете начать работу посредством запуска MicroLark из командной строки с файлом MicroXML в качестве входа. Листинг 1 представляет собой небольшую модификацию простого файла из первой статьи в этом цикле.

Листинг 1. Простой файл
<!DOCTYPE html>
<html lang="en">
  <!-- A comment -->
  <head>
    <title>Welcome page</title>
  </head>
  <body>
    <p>Welcome to <a href="http://ibm.com/developerworks/">IBM developerWorks</a>.</p>
  </body>
</html>

Сохраните этот пример в виде файла listing1.xml, а затем направьте этот файл в инструмент MicroLark, воспользовавшись для этого кодом в листинге 2.

Листинг 2. MicroLark
java -jar microlark.jar listing1.xml

Вы должны получить выходную информацию, как в листинге 3.

Листинг 3. Output
(html
Alang en
-\n
-  
-\n
-  
(head
-\n
-    
(title
-Welcome page
)title
-\n
-  
)head
-\n
-  
(body
-\n
-    
(p
-Welcome to 
(a
Ahref http://ibm.com/developerworks/
-IBM developerWorks
)a
-.
)p
-\n
-  
)body
-\n
)html

Выглядит странновато? Листинг 3 представлен в формате под названием PYX (линейно-ориентированное представление XML-документов, основанное на соглашении для представления SGML-документов). PYX представляет всю информацию XML-документа таким способом, который минимизирует нагрузку парсинга. Это чрезвычайно полезный механизм, которым, к сожалению, пренебрегают XML-разработчики.

По умолчанию инструмент MicroLark конвертирует MicroXML-документ в формат PYX или точнее в подмножество PYX (если исходить из факта, что технология MicroXML – это подмножество технологии XML). (Более подробная информацию по PYX содержится в статье XML Matters: Введение в PYX, см. раздел Ресурсы.)

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

Листинг 4. Префиксные символы
(  start-tag
)  end-tag
A  attribute
-  character data (content)
?  processing instruction

Обозначения соответствую показанной выше входной информации. Привлекательность формата PYX состоит в том, что он может использоваться со старыми и неизменно полезными командами UNIX® для обработки текста (grep, awk, sort, sed, awk и т. д.).

Обработка ошибок

Как и в случае любого другого XML-парсера или MicroXML-парсера, необходимо понимать, что происходит в случае ввода ошибочной информации. В листинге 5 приведен пример "неправильно построенного" XML-кода из первой статьи в этом цикле.

Листинг 5. Неправильно построенный XML-код
<para>Hello, I claim to be <strong>MicroXML</para>

Сохраните этот пример в виде файла badxml.xml и исполните его с помощью MicroLark. Вы получите следующую выходную информацию (листинг 6).

Листинг 6. Обработка ошибок
$ java -jar microlark.jar badxml.xml
(para
-Hello, I claim to be 
(strong
-MicroXML
!1:50:Unexpected end-tag

Инструмент MicroLark начинает свою работу с генерации строк в формате PYX, а затем резко останавливается с сообщением об ошибке, когда встречается с несоответствующим тегом. В выходной информации указывается строка и столбец исходного файла, в которых произошла ошибка.


API-интерфейс парсера

Большинство пользователей захочет познакомиться с парсером MicroLark поближе. Чтобы сделать это без излишнего углубления в сложный программный код на языке Java мы воспользуемся превосходным инструментом для создания прототипов под названием Jython. Jython — это Java-реализация языка программирования Python, которая генерирует байт-код на языке Java и способна исполнять его. Jython позволяет разработчику взаимодействовать с Java-классами и API-интерфейсами посредством гораздо более простого языка.

Парсер push

Если вы знакомы с API-интерфейсом SAX (Simple API for XML), значит, вы уже знакомы и с интерфейсом push. Чтобы использовать интерфейс push в инструменте MicroLark, вы предоставляете классу SAX-подобные методы для манипулирования различными конструкциями, такими как элементы, атрибуты и символьные данные. Используйте интерфейс ContentHandler для предоставления класса. Инструмент MicroLark имеет несколько служебных классов с этим интерфейсом, в том числе класса PyxWriter, который генерирует информацию в формате PYX, как в листинге 3.

В листинге 7 показана простая Jython-программа для репликации базовой операции командной строки инструмента MicroLark.

Листинг 7. PYX
from org.ccil.cowan.microlark import PyxWriter, Parser
from java.lang import System

pw = PyxWriter(System.out)  
f = open(System.in)
p = Parser()     
p.parse(f, pw)

Сохраните выходную информацию в виде файла listing4.py, а затем вызовите его, как показано в листинге 8.

Листинг 8. Пример вызова
jython -Dpython.path=microlark.jar listing3.py < listing1.xml

Специализированный обработчик контента

Как правило, разработчик желает задействовать свой собственный класс обработчика контента – с более специализированными возможностями. В листинге 9 показан класс link_finder, который проверяет каждый элемент с целью выявления, не является ли он элементом a (ссылка в стиле HTML). После этого обработчик контента выводит на печать значение атрибута href.

Листинг 9. Специализированный обработчик
from org.ccil.cowan.microlark import ContentHandler, Parser

class link_finder(ContentHandler):
    def startElement(self, elem):
        if elem.getName() == u'a':
            print elem.getAttributeValue(u'href')

f = open('listing1.xml')
p = Parser()     
p.parse(f, link_finder())

При исполнении кода в листинге 9 вы найдете в документе единственную ссылку: http://ibm.com/developerworks/.

Парсер pull

Другой подход к парсингу – метод pull, который запрашивает фрагменты анализируемого документа и задействует служебные методы для работы с результирующими событиями, представляющими теги элемента или его контент. В листинге 10 интерфейс pull используется для обработки файла примерно таким же образом, как при использовании интерфейса push в листинге 7.

Листинг 10. API-интерфейс pull
from org.ccil.cowan.microlark import Parser

f = open('listing1.xml')
p = Parser()

#Start the pull parse
p.parse(f)

event = None

#Run through all the events in the document
while event != p.END_DOCUMENT:
    #Pull the next event
    event = p.next()
    #Is it an element start tag?
    if event == p.START_ELEMENT:
        #Get the element's information
        elem = p.getElement()
        #Is it an a element?
        if elem.getName() == u'a':
            #Then print the link value
            print elem.getAttributeValue(u'href')

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

Построитель дерева

Кроме того, инструментом MicroLark можно воспользоваться для построения DOM-подобного дерева (Document Object Model). С этой целью примените метод buildTree () к объекту Parser.


Демонстрация

В первой статье этого цикла объясняется, как технология MicroXML поддерживает пространства имен XML, упрощая ситуацию в максимально возможной степени. Инструмент MicroLark отслеживает пространство имен, ассоциированное с любым элементом/атрибутом, к которому можно обратиться с помощью метода getNamespace или getAttributeNamespace, соответственно. Не нужно никакой ерунды типа префиксов и qname-классов. В листинге 11 показана простая программа, которая производит синтаксический анализ файла и сигнализирует при каждом обнаружении нового пространства имен по умолчанию.

Листинг 11. Обнаружение пространств имен по умолчанию
from org.ccil.cowan.microlark import Parser
from java.lang import System

p = Parser()

#Start the pull parse
p.parse(System.in)

event = None
current_namespace = None

#Run through all the events in the document
while event != p.END_DOCUMENT:
    #Pull the next event
    event = p.next()
    #Is it an element start tag?
    if event == p.START_ELEMENT:
        #Get the element's information
        elem = p.getElement()
        #Has the namespace changed?
        if elem.getNamespace() != current_namespace:
            current_namespace = elem.getNamespace()
            #Print the new namespace
            print "Entering default namespace: ", current_namespace

В листинге 12 показан пример Atom-документа в формате MicroXML. По умолчанию для элемента feed назначается пространство имен Атом, а для элемента div назначается пространство имен XHTML.

Листинг 12. Пример Atom-документа
<feed xmlns="http://www.w3.org/2005/Atom"
      xml:lang="en"
      xml:base="http://copia.ogbuji.net">
  <id>http://copia.ogbuji.net/atom1.0</id>
  <title>Copia</title>
  <updated>2005-07-15T12:00:00Z</updated>
  <author>
    <name>Uche Ogbuji</name>
    <uri>http://uche.ogbuji.net</uri>
  </author>
  <link href="/blog" />
  <link rel="self" href="/blog/atom1.0" />
  <entry>
    <id>http://copia.ogbuji.net/blog/2005-09-16/xhtml</id>
    <title>XHTML tutorial pubbed</title>
    <link href="http://copia.posterous.com/xhtml-tutorial-pubbed"/>
    <category term="xml"/>
    <category term="css"/>
    <category term="xhtml"/>
    <updated>2005-07-15T12:00:00Z</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <a href="http://www.ibm.com/developerworks/edu/x-dw-x-xhtml-i.htm">
            "XHTML, step-by-step"
          </a>
        </p>
        <blockquote>
          <p>Start working with Extensible Hypertext Markup Language. In this tutorial,
          author Uche Ogbuji shows you how to use XHTML in practical Web sites.</p>
        </blockquote>
        <p>In this tutorial</p>
        <ul>
          <li>Tutorial introduction</li>
          <li>Anatomy of an XHTML Web page</li>
          <li>Understand the ground rules</li>
          <li>Replace common HTML idioms</li>
          <li>Some practical considerations</li>
          <li>Wrap up</li>
        </ul>
      </div>
    </content>
  </entry>
</feed>

Сохраните содержимое листинг 11 как файл listing7.py, а содержимое листинга 12 как файл listing8.xml. Затем запустите оба этих файла с помощью Jython. Вы должны получить выходную информацию, как в листинге 13.

Листинг 13. Output
>$ jython -Dpython.path=microlark.jar listing7.py < listing8.xml 
Entering default namespace:  http://www.w3.org/2005/Atom
Entering default namespace:  http://www.w3.org/1999/xhtml

Заключение

Другие статьи данного цикла

Спецификация не имеет большого значения без практичной реализации. Поэтому было так важно, чтобы кто-то сделал первый шаг и реализовал MicroXML на практике. Дж. Кован указал путь с помощью MicroLark. В общем и целом, инструмент MicroLark несложен в усвоении, особенно в рамках нетребовательного к ресурсам каркаса Jython. Надеюсь, теперь вы располагаете всем необходимым для того, чтобы приступить к экспериментам с MicroXML.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=XML, Open source
ArticleID=843888
ArticleTitle=Представляем MicroXML: Часть 2. Обработка MicroXML с помощью инструмента MicroLark
publish-date=10312012