XML は並外れて成功した技術ですが、欠点があります。その並外れた成功は、XML に対する非常に厳密な検証によってもたらされたものであり、ごく初期の頃から XML を再設計しようとする試みがなされてきました。現在、開発者は XML の名前空間の複雑さや、XPath、XSLT、XQuery 3.0 といった最近の XML 処理仕様と格闘しています。XML の中心的な専門家として影響力を持つ人々のなかには、XML そのものを単純化して最初からやり直すという大胆な可能性を検討した人もいました。
XML は、HTML5 に取り組む Web ブラウザー開発者達によっても脅かされています。XHTML5 と呼ばれることもある標準は、XML を抜本的に再考したものと言え、XML エコシステムで最も重視されてきた原則の一部を無視しています。しかし XHTML5 は、HTML5 を支持する人々の大半から、使いにくいものとしてとみなされてもいます。
こうした勢力のせめぎ合いから、XML-DEV メーリング・リストやさまざまなブログでの議論が生まれました。最終的に、James Clark 氏が MicroXML の完全な提案を行いました。そして W3C XML Core ワーキング・グループの John Cowan 氏が MicroXML 仕様の策定に中心的なコントリビューター兼編集者として参加しました。
MicroXML は、一般に認知されている標準化団体のいずれにおいても正式な標準として承認されていませんが、いくつかの理由から XML 開発者の興味を大いにそそります。John Cowan 氏は既に、Java で実装した MicroLark を開発しており、私は Python で実装したものを開発しました。MicroXML 仕様は大きな関心を集めています (「参考文献」を参照)。JSON や Markdown といった最近の最も重要な仕様の多くが、同じように非公式な形で開始されたことを思い出してください。
MicroXML を理解することによる最も価値ある側面の 1 つは、MicroXML を理解することは、完全な XML を学ぶ最も効果的な方法になることです。この記事では MicroXML について説明します。具体的には、いくつかの例を用いて MicroXML と完全な XML との重要な違いを探り、そうした違いの論理的な根拠についても説明します。この記事では読者が XML の基本を理解していることを前提としています。
MicroXML には以下の 2 つの重要な目標があります。
- 非常に単純なデータ・モデルを維持する
- XML との後方互換性を維持する
他のすべては、この 2 つの目標から派生しています。MicroXML 文書は整形式の XML 文書です。また MicroXML は HTML5 や JSON との親和性を考慮して設計されています。
Infoset や XDM (XPath Data Model) など、XML データ・モデルに関する主な仕様は何十ページにもなります。スマートさと軽量さで知られている XPath 1.0 データ・モデルでさえ、仕様は数ページあります。MicroXML データ・モデルは、JSON との親和性に関する注記を除けば、約半ページです。John Cowan 氏は、それをさらに 1 つの段落にまで減らしています。その全体を以下に引用します。
「文書のデータ・モデルは少なくとも 1 つの要素オブジェクトで構成されます。要素オブジェクトは文書内の 1 つの要素を抽象的に記述したものです。各要素オブジェクトには、名前、属性マップ、子のシーケンス、という 3 つのプロパティーが関連付けられています。名前はストリングであり、属性マップは名前のストリングを値のストリングにマッピングし、シーケンス内の 1 つひとつの子は文字データを表現するストリング、または要素オブジェクトです。」
この記事のこれから先では MicroXML の構文に焦点を絞ります (構文のフローとデータ・モデルは、極めて直接的に対応します)。MicroXML では、全体を包含する概念は MicroXML 文書であり、MicroXML 文書は MicroXML 仕様に完全準拠する入力ストリームを構文解析した結果として得られます。
XML と MicroXML との最も根本的な違いは、パーサーによるエラー処理の動作です。XML のエラー処理は厳格さで悪名高く、パーサーは最初のエラーを検出すると即座に停止する必要があります。このことは、HTML のいい加減なマークアップに人々が慣れてしまっていることも手伝って、大きな論争の的となってきました。XML を批判する人達がポステルの法則を引用する場合もあります。つまり「送信する内容に関しては厳密に、受信する内容については寛容に」すべきなのです。
MicroXML の場合、パーサーはエラーを検出した後も動作を継続することができます。ただしパーサーはエラーを検出した時点で何らかの方法でフラグを立て、入力が MicroXML 文書ではないことを知らせる必要があります。こうすることで、仕様に準拠する MicroXML パーサーは、入力を別の方法で解釈するように動作を切り換えることもできます。HTML パーサーは標準に準拠するモードから「タグ・スープ」モードに切り換えることができます。それと同様に考えれば、MicroXML パーサーの動作の感覚がつかめると思います。
例えば、XML プロセッサーが以下のような入力に遭遇した場合、</para> に到達した時点で即座に停止し、開始タグと終了タグが一致しないことによる非整形式エラーを発生しなければなりません。
<para>Hello, I claim to be <strong>MicroXML</para> |
MicroXML パーサーはその時点で動作を継続するかもしれませんが、もはや入力を MicroXML 文書と解釈してレポートすることはありません。MicroXML
パーサーはさらに、出力を修正して </para> の直前に </strong> を挿入することも可能ですが、その場合も、MicroXML パーサーは修正結果が MicroXML 文書であるとレポートすることはありません。入力を予測できない実際のシステムを設計している場合には、このように整形式性に関する制約が MicroXML では少し緩いことが大きな違いをもたらします。
MicroXML は UTF-8 エンコーディングのみをサポートしています。MicroXML 文書は UTF-8 でエンコードされた文字のシーケンスであり、それらの文字によって MicroXML のデータ・モデルで表現された構造が形成されます。XML の場合と同様、文字シーケンス自体は「テキスト」と呼ばれ、マークアップと文字データで構成されます。以下の例はテキストと文字データの技術的な違いを示しています。
<para style="friendly">Hello, I am...<strong>MicroXML</strong></para> |
<para> タグから </para> タグまでの間にあるものはすべてテキストですが、文字データは以下のシーケンスのみです。
friendlyHello, I am...MicroXML
属性値の中にあるもの、要素を構成するタグの間にあるものが、文字データです。
要素、属性、文字データは XML の基礎であり、MicroXML の場合も、これらの構成体に関して大きな変更はありません。最大の違いは、MicroXML では要素名の中でコロンが禁止されていることです。そのため、XML 名前空間仕様を適用するためによく使用される接頭辞が付いた要素を指定することはできません。MicroXML は名前空間をサポートしていますが、後ほど説明するように、すべての要素を接頭辞のない形式で使用する必要があります。
属性には接頭辞で名前空間を指定する形式を使用することができ、これらの属性はグローバル属性と呼ばれることもあります。MicroXML 仕様では、以下の属性の使用について規定されています。
-
xml:space xml:langxml:basexml:id
XML 1.0 では spam:eggs:toast のような属性名を使用することができますが、こうした属性名は XML の名前空間では禁止されており、MicroXML でも禁止されています。接頭辞なしの属性に関する規則は MicroXML の場合も XML の場合も同じであり、ある名前空間の要素内に接頭辞なしの属性がある場合でも、その接頭辞なしの属性はどの名前空間の中でも使用することはできません。
XML の場合と同じく、MicroXML でも属性内のホワイトスペースは正規化されません。XML の場合、以下の 2 つの文書を区別することはできません。
<para>Hi. I'm some form of <abbr ref="Extensible Markup Language">XML</abbr></para> <para>Hi. I'm some form of <abbr ref=" Extensible Markup Language ">XML</abbr></para> |
ref 属性の中にあるホワイトスペースの違いに注目してください。MicroXML の場合、属性内のホワイトスペースは、そのまま正確に解釈されるため、上記 2 つの文書は異なることになります。
XML の処理命令 (PI: Processing instruction) は常に議論の対象となってきた領域であり、それは MicroXML でも同じです。PI
を含めることを要求する人もいれば、PI を一切含めないよう要求する人もいます。HTML5 での PI の将来も不確定です。MicroXML
は適切なバランスをとり、開始タグと同じように見える限定的な PI セットを許可しています。PI として最も一般的な xml-stylesheet は、MicroXML でも使用することができます。
<?xml-stylesheet type="text/css" href="mystyles.css"?> |
MicroXML のコメントは XML のコメントと非常によく似ています。いくつか制約を追加することによって HTML5
に対応していますが、それらは大半の開発者にはおそらく影響しません。互換性の理由から、MicroXML は XML の制約を緩めてはいません。特に、コメント内で 2
つのダッシュ (--) を使用することは許されないため、コメントをネストさせることはできません。
コメントはあくまでも文書を読む人々のためのものであり、パーサーはコメントを無視します。MicroXML パーサーは PI があると通知しますが、PI がデータ・モデルの一部とみなされることはありません。MicroXML の PI を認識、使用するアプリケーションは、データ・レイヤーではなく構文レイヤーで動作する必要があります。
MicroXML では XML の名前空間に対する扱いが単純化されています。パーサーは名前空間を宣言する属性 (xmlns と xmlns:a) に対して特別な処理を行わず、通常の属性としてアプリケーションに提示します。この情報を基に、当然、MicroXML アプリケーションには、接頭辞と組み合わせなくても要素や属性のみで普遍的な名前となるようなモデルを構築することが推奨されます。
概して MicroXML では、XLink などの仕様を、SVG などの従属仕様を含めてサポートしています。
MicroXML には以下の点に関する短いセクションが含まれています。
- 自然言語の指定 (
xml:lang) とホワイトスペースの保持 (xml:space) に関するセクション (XML 1.0 の場合と似ています) xml:baseとxml:idに関するセクション (XML Core ワーキング・グループによる仕様と似ています)
MicroXML でサポートされている文書型宣言は、ルート要素名を宣言する単純な宣言のみです。MicroXML では、DTD (Document Type Definition) は内部サブセットでも外部サブセットでも、まったくサポートされていません。
このセクションでは、かなり完全な実際の例としての典型的な XML を取り上げ、それらが MicroXML ではどのようになるかを示します。Atom
は複数の名前空間を含んでいることが多いため、サンプル・フォーマットには適しています。リスト 1 はチュートリアル「Process
Atom 1.0 with XSLT」(「参考文献を参照」) のリストを元にしています。ここでは MicroXML
での名前空間に関する変更がわかりやすいように、entry 要素の 1 つを削除し、feed などの Atom
のコア要素すべてに名前空間接頭辞 a を使用しています。
リスト 1. 典型的な XML
<?xml version="1.0" encoding="utf-8"?>
<a:feed xmlns:a="http://www.w3.org/2005/Atom" xmlns="http://www.w3.org/1999/xhtml"
xml:lang="en"
xml:base="http://copia.ogbuji.net">
<a:id>http://copia.ogbuji.net/atom1.0</a:id>
<a:title>Copia</a:title>
<a:updated>2005-07-15T12:00:00Z</a:updated>
<a:author>
<a:name>Uche Ogbuji</a:name>
<a:uri>http://uche.ogbuji.net</a:uri>
</a:author>
<a:link href="/blog" />
<a:link rel="self" href="/blog/atom1.0" />
<a:entry>
<a:id>http://copia.ogbuji.net/blog/2005-09-16/xhtml</a:id>
<a:title>XHTML tutorial pubbed</a:title>
<a:link href="http://copia.posterous.com/xhtml-tutorial-pubbed"/>
<a:category term="xml"/>
<a:category term="css"/>
<a:category term="xhtml"/>
<a:updated>2005-07-15T12:00:00Z</a:updated>
<a:content type="xhtml">
<div>
<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>
</a:content>
</a:entry>
</a:feed>
|
リスト 2 はリスト 1 を MicroXML で表現したものです。XML
宣言がないことに注意してください。MicroXML では UTF-8 エンコーディングしかサポートしていないため、XML
宣言はサポートしておらず、必要もありません。また、どの要素にも接頭辞はありません。デフォルト名前空間は feed
要素では Atom に設定されており、div 要素では XHTML に設定されています。
リスト 2. MicroXML で表現したバージョン
<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>
|
リスト 3 は MicroXML 文書ですが、妥当な HTML5 文書でもあります。この例では、単純化された DOCTYPE 宣言と、PI、コメントが使われています。
リスト 3. MicroXML であると同時に妥当な HTML5 でもある文書
<!DOCTYPE html>
<?xml-stylesheet type="text/css" href="mystyle.css"?>
<html lang="en">
<!-- A comment -->
<head>
<title>Welcome page</title>
</head>
<body>
<p>Welcome to <a href="ibm.com/developerworks/">IBM developerWorks</a>.</p>
</body>
</html>
|
MicroXML はまだ新しく登場したばかりの仕様です。私は、皆さんが完全な XML を使用するのをやめて全面的に MicroXML を採用することを必ずしも支持するわけではありません。しかし、MicroXML の発展が重要であることは確かです。MicroXML を理解すれば、JSON や HTML5 の登場といった最近の変化に直面するなかで XML を最も効果的に使用する方法を十分理解できるはずです。MicroXML 仕様は非常に簡潔であり、いくつかのツールがまもなくリリースされる見通しです。ぜひ皆さんも MicroXML を試してみてください。
学ぶために
- 「MicroXML の紹介: 第 2 回 MicroLark を使用して MicroXML の処理を行う」(Uche Ogbuji 著、 developerWorks、2012年6月): この連載の第 2 回で、サンプル・コードを用いて MicroXML 用 MicroLark パーサーについて学んでください。
- 「MicroXML Specification」(John Cowan 著、2011年6月): MicroXML 文書である MicroXML の仕様を読み、MicroXML について学んでください。
- 「More on MicroXML」(James Clark 著、2010年12月): どのようにして MicroXML が生まれてきたかについて学んでください。
- 「HTML5 の基礎: 第 1 回
最初の一歩」(Grace Walker 著、developerWorks、2011年5月): HTML5 について学び、HTML5 で XML
に関係する部分については「XML 的思索: HTML5 の XML 的な部分」(Uche Ogbuji 著、developerWorks、2010年7月) を読んで学んでください。
- 「Process Atom 1.0
with XSLT」(Uche Ogbuji 著、developerWorks、2005年12月): このチュートリアルを読み、XSLT と実際の事例を使用して Atom 文書を処理する方法について学んでください。
- 「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 ユーザーとのつながりを持てる他、開発者によるブログ、フォーラム、グループ、ウィキを調べることができます。
