本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。プロフィールで選択した情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

MicroXML の紹介: 第 2 回 MicroLark を使用して MicroXML の処理を行う

先駆的な MicroXML パーサーを試す

Uche Ogbuji, Partner, Zepheira, LLC
Photo of Uche Ogbuji
Uche Ogbuji は次世代の Web 技術によるソリューションを専門とする会社 Zepheira, LLCパートナーです。Ogbuji 氏は XML、RDF、およびナレッジ・マネージメント・アプリケーション用のオープンソース・プラットフォームである 4Suite とその後継である Akara の中心的開発者です。彼はナイジェリア出身のコンピューター・エンジニア兼ライターとして米国コロラド州ボルダーに住み、そこで働いています。彼に関して詳しくは、彼のブログである Copia または Twitter を見てください。

概要: MicroXML は XML と後方互換性を持たせた上で XML を単純化したものです。この連載の第 1 回では MicroXML の基本原則について説明しました。MicroXML は単純な文法で設計されており、数多くある最近の汎用構文解析ツールを使用して処理することができます。John Cowan 氏は Java 環境で動作するオープンソースの MicroXML パーサー、MicroLark を開発しました。この記事では、サンプル・コードを使用しながら MicroXML について学びます。

このシリーズの他の記事を見る

日付:  2012年 7月 12日
レベル: 中級 この記事の原文:  英語 PDF:  A4 and Letter (331 KB | 10 ページ)Adobe® Reader® が必要
アクティビティー: 3438 ビュー
お気軽にご意見・ご感想をお寄せください: 


概要

MicroXML は XML と後方互換性を持たせて XML を単純化したものであり、新しく登場したばかりの仕様です。この連載の第 1 回「MicroXML の基本原則を探る」では、MicroXML の基本事項について、さらには XML 1.x および関連する標準と MicroXML との違いについて学びました。James Clark 氏によって提案された MicroXML は、John Cowan 氏によって推進され、最初の MicroXML 用パーサー MicroLark も John Cowan 氏によって作成されました。MicroLark は Java 言語で作成されたオープンソース (Apache 2.0 ライセンス) のパーサーであり、構文解析のモードをいくつか実装しています (プル・モード、プッシュ・モード、ツリー・モード)。

この記事では MicroXML フォーマットの構文解析方法を学ぶために、コマンドラインとサンプル・コードを使用して、MicroLark パーサーの API のさまざまな側面を探ります。

はじめに

この記事で紹介する例を実際に試すためには、以下の 2 つをダウンロードする必要があります (「参考文献」を参照)。

  • microLark.jar (お好みによっては、ソース・コード)
  • オープンソースの Jython インタープリター

まず、MicroXML ファイルを入力として、コマンドラインで MicroLark を実行します。リスト 1 は「第 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 として保存し、リスト 2 のコードによって MicroLark に入力します。


リスト 2. MicroLark の実行

java -jar microlark.jar listing1.xml

するとリスト 3 の出力が得られるはずです。


リスト 3. MicroLark の出力
(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 は XML 文書を行指向で表現する PYX というフォーマットで表示しています。PYX は、元々 SGML 文書を表現するための規則から派生したフォーマットで、構文解析の負担が最小となる形で XML 文書内のすべての情報を表現します。PYX は非常に便利な手段となりますが、残念ながら XML 開発者にはあまり利用されていません。

MicroLark のデフォルト動作は、MicroXML が XML のサブセットであるという事実に基づいて、MicroXML 文書を PYX もしくは厳密には PYX のサブセットに変換することです (PYX については、「参考文献」に挙げた「XMLの論考: 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 は「第 1 回」で紹介した不適切な形式の XML の例です。


リスト 5. 不適切な形式の XML

<para>Hello, I claim to be <strong>MicroXML</para>

上記の例を badxml.xml として保存し、その badxml.xml を MicroLark で実行すると、リスト 6 の出力が得られます。


リスト 6. MicroLark のエラー処理
$ 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 言語の実装です。Jython を使用すると、Java 言語よりもはるかに単純な言語を使用して Java のクラスや API を扱うことができます。

プッシュ・パーサー

SAX (Simple API for XML) についてよく理解している読者であれば、プッシュ・インターフェースについてもよく理解していることと思います。MicroLark のプッシュ・インターフェースを使用するには、SAX に非常によく似たメソッドを持つクラスを用意し、さまざまな構成体 (要素、属性、文字データなど) を処理します。そうしたクラスを用意するためには ContentHandler インターフェースを使用します。MicroLark には、このインターフェースを持つユーティリティー・クラスがいくつかあり、(リスト 3 に示すような) PYX を生成する PyxWriter もその 1 つです。

リスト 7 は MicroLark の基本的なコマンドライン操作を再現する単純な Jython プログラムです。


リスト 7. PYX を生成する PyxWriter

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 のように listing4.py を呼び出します。


リスト 8. 呼び出しの例

jython -Dpython.path=microlark.jar listing3.py < listing1.xml

特別なコンテンツ・ハンドラー

通常は、何かもっと特別なことをする独自のコンテンツ・ハンドラー・クラスを作成したいと思うものです。リスト 9 には、各要素が a 要素 (HTML スタイルのリンク) であるかどうかを調べる link_finder クラスを定義しています。このコンテンツ・ハンドラーは a 要素を見つけると 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/ へのリンク) を見つけることができます。

プル・パーサー

構文解析を行うためのもう 1 つの方法がプル方式です。この方式では、文書の一部を一度に要求し、ユーティリティー・メソッドを使用することで、要素タグまたはコンテンツを表すイベントを処理します。リスト 10リスト 7 のプッシュのときと非常によく似た方法で、プル API を使用してファイルを処理します。


リスト 10. プル API

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 の場合と同じです。

ツリー・ビルダー

DOM (Document Object Model) で作成されるようなツリーを MicroLark を使用して作成することもできます。そのためには Parser オブジェクトの buildTree() メソッドを使用します。


デモ

第 1 回で、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 は MicroXML フォーマットを使用した Atom 文書の例です。デフォルト名前空間が feed 要素では Atom に、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. Jython の出力

>$ 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 を実装したのは重要なことでした。John Cowan 氏は先頭を切って MicroLark を作成しました。MicroLark は、そのほとんどを容易に理解することができ、特に軽量のフレームワークである Jython の中では容易になります。これで、皆さんが MicroXML の実験を始めるために必要なツールが用意できたのではないかと思います。


参考文献

学ぶために

  • MicroXML の紹介: 第 1 回 MicroXML の基本原則を探る」(Uche Ogbuji 著、developerWorks、2012年5月): この連載の第 1 回で MicroXML の基本事項を学んでください。

  • 魅力的なJython」(Uche Ogbuji 著、developerWorks、2003年5月): Java で実装した Python がいかに開発に役立つかを学んでください。

  • XMLの論考: PYX入門」(David Mertz 博士著、developerWorks、2002年2月): オープンソースの PYX フォーマットについての記事を読んでください。

  • Understanding SAX」((Nicholas Chase 著、developerWorks、2003年7月): SAX (Simple API for XML) について学んでください。

  • Understanding DOM」((Nicholas Chase 著、developerWorks、2003年7月公開、2007年3月更新): Document Object Model について学んでください。

  • XML 的思索」: Uche Ogbuji 著の連載コラムを読んでください。

  • New to XML には、XML を学ぶために必要なリソースが豊富に用意されています。

  • developerWorks の XML ゾーン: DTD、スキーマ、XSLT など、XML の領域でのスキルを磨くためのリソースが豊富に用意されています。XML の技術文書一覧には、広範な話題を網羅した技術記事やヒント、チュートリアル、技術標準、IBM Redbooks が豊富に用意されています。

  • IBM XML certification: XML および関連技術において IBM 認定技術者になる方法を参照してください。

  • developerWorks の Technical events and webcasts: これらのセッションで最新情報を入手してください。

  • developerWorks on Twitter: 今すぐ Twitter に参加して developerWorks のツイートをフォローしてください。

  • developerWorks podcasts: ソフトウェア開発者のための興味深いインタビューや議論を聞いてください。

  • developerWorks on-demand demos: 初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。

製品や技術を入手するために

  • IBM 製品の評価版: IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2、Lotus、Rational、Tivoli、WebSphere などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。

議論するために

著者について

Photo of Uche Ogbuji

Uche Ogbuji は次世代の Web 技術によるソリューションを専門とする会社 Zepheira, LLCパートナーです。Ogbuji 氏は XML、RDF、およびナレッジ・マネージメント・アプリケーション用のオープンソース・プラットフォームである 4Suite とその後継である Akara の中心的開発者です。彼はナイジェリア出身のコンピューター・エンジニア兼ライターとして米国コロラド州ボルダーに住み、そこで働いています。彼に関して詳しくは、彼のブログである Copia または Twitter を見てください。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML, Open source, Web development
ArticleID=824444
ArticleTitle=MicroXML の紹介: 第 2 回 MicroLark を使用して MicroXML の処理を行う
publish-date=07122012