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 フォーマットの行を出力し、開始タグと終了タグとが対応していないことを検出すると、エラー・メッセージを出力して突然停止します。出力には、ソース・ファイルのどの行と列でエラーが発生したしたのかが特定されています。
ほとんどのユーザーは 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 などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。
議論するために
- developerWorks
プロフィール: 今すぐプロファイルを作成し、ウォッチ・リストを設定してください。
- XML
ゾーンのディスカッション・フォーラム: これらのフォーラムでは XML に関連する議論が行われています。
- developerWorks コミュニティー: ここでは他の developerWorks ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、ウィキを調べることができます。
