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

JavaScript による MicroXML パーサーを試す

MicroXML は、これまでの XML のバージョンと互換性を持ちつつ、XML を単純化したものです。この全 2 回からなる連載の第 1 回では MicroXML の基本原則について説明しました。MicroXML は単純な文法で設計されており、数多くある最近の汎用構文解析ツールを使用して処理することができます。MicroXML の当初の活動を率いた James Clark 氏は、MicroXML コミュニティーの仕様に対応するパーサーを検討して開発を行った 1 人です。この記事では、Clark 氏が開発した、JavaScript による MicroXML パーサーを使用して、MicroXML フォーマットを試す方法を説明します。

編集者による注記: この全 2 回からなる連載が最初に公開されたのは 2012年ですが、その後 MicroXML の仕様に重要な更新があったため、それを反映するために内容が改訂されました。

Uche Ogbuji, Partner, Zepheira, LLC

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



2013年 8月 08日 (初版 2012年 7月 12日)

これまでの XML のバージョンと互換性を持ちつつ、XML を単純化した MicroXML は、W3C のコミュニティー・グループの下で新しく登場したばかりの仕様です。この連載の第 1 回「MicroXML の基本原則を探る」では、MicroXML の基本事項について、さらには XML 1.x および関連する標準と MicroXML との違いについて学びました。

James Clark 氏によって提案された MicroXML は、John Cowan 氏によって推進され、最初の MicroXML 用パーサーである MicroLark (オープンソースの Apache 2.0 ライセンス) も John Cowan 氏によって作成されました。MicroLark は Java 言語で作られており、構文解析のモードをいくつか実装しています (プル・モード、プッシュ・モード、ツリー・モード)。この記事を執筆している時点で、Cowan 氏はまだ、最新の MicroLark コミュニティー仕様に準拠するように MicroLark を更新していませんが、新しく登場した他の実装のなかには、James Clark 氏によるプロジェクトの JavaScript と Java によるパーサーの実装もあります。

この記事では、James Clark 氏が開発した JavaScript によるパーサー (microxml-js) を使用してブラウザー内で MicroXML フォーマットを構文解析する方法を説明します。

はじめに

この記事で紹介する例を実際に試すには、microxml-js をダウンロードする必要があります (「参考文献」を参照)。コードを Git バージョン管理システムから取得できるソフトウェアを使用するか、microxml-js GitHub ページで ZIP をクリックするか、いずれかの方法でダウンロードすることができます。

ダウンロードしたファイルを解凍し、ブラウザーでそれらのファイルが保存されている場所へナビゲートして test.html ファイルを開くと、図 1 のようなページが表示されます。

図 1. microxml-js の HTML テスト・ページの最初の状態
microxml-js の HTML テスト・ページの最初の状態を示すブラウザーのスクリーン・キャプチャー

このページを構成する主な要素には、<doc></doc> というコンテンツが含まれたテキスト域があります。パーサーを実行するには、このテキスト域に MicroXML を入力または貼り付けてから、「Parse (構文解析)」をクリックします。パーサーは、MicroXML データ・モデルの JSON 表現の情報に従って、MicroXML を JSON オブジェクトに変換します。結果として生成される JSON コードは、「JSON data model (JSON データ・モデル)」セクションに表示されます。図 2 には、<doc></doc> という MicroXML の行を構文解析した結果が示されています。

図 2. 構文解析のテストをした後の microxml-js の HTML テスト・ページ
構文解析のテストをした後の microxml-js の HTML テスト・ページを示すブラウザーのスクリーン・キャプチャー

図 2 では、結果として生成された JSON コードを黄色の楕円で囲ってあります (黄色の楕円自体がブラウザー上に表示されているわけではありません)。この JSON コードは以下のようになっています。

["doc",{},[]]

サンプル MicroXML を試してみる

リスト 1 は、第 1 回の簡単な MicroXML ファイルにわずかな変更を加えたものです。

リスト 1. 簡単な MicroXML ファイル
<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>

test.html のテキスト域にリスト 1 を貼り付けて、構文解析した結果を図 3 に示します (テキスト域には赤のドットによる下線が表示されていますが、これは Firefox のスペルチェッカーによるものなので、無視してください)。

図 3. リスト 1 を構文解析した後の microxml-js の HTML テスト・ページ
リスト 1 を構文解析した後の microxml-js の HTML テスト・ページを示すブラウザーのスクリーン・キャプチャー

図 3 に表示されている JSON コードは、以下のとおりです。

["html",{"lang":"en"},["\n  \n  ",["head",{},["\n    ",["title",{},["Welcome page"]],"\n

表示結果の改善

生成された JSON コードは、ブラウザー・ウィンドウの右側境界を越えて続いていることに注目してください。左スクロールや右スクロールを実行すれば、この JSON コードをすべて見ることはできますが、JSON コードの構造をもっと理解しやすくするには、コードを見やすく出力できると好都合です。そこで、この見やすい出力を実装するために、test.html の下記行に簡単な変更を加えました。

document.getElementById("json").textContent = 
   JSON.stringify(MicroXML.parse(textarea.value));

上記行を下記行に変更しました。

document.getElementById("json").textContent = 
   JSON.stringify(MicroXML.parse(textarea.value), undefined, 2);

この変更したファイルは、test1.html という名前で保存し、ロードしたバージョンがわかるようにページ・タイトルにも若干変更を加えました。test1.html をロードして、リスト 1 の構文解析を行うと、図 4 に示す結果が生成されます。

図 4. 変更が加えられた microxml-js の HTML テスト・ページに、リスト 1 を構文解析した結果が表示されている様子
変更が加えられた microxml-js の HTML テスト・ページに、リスト 1 を構文解析した結果が表示されているブラウザーのスクリーン・キャプチャー

データ・モデルの詳細

リスト 2 には、リスト 1 から生成される JSON データ・モデルの完全な出力を示しています。

リスト 2. リスト 1 から構文解析される JSON データ・モデル
[
  "html",
  {
    "lang": "en"
  },
  [
    "\n  \n  ",
    [
      "head",
      {},
      [
        "\n    ",
        [
          "title",
          {},
          [
            "Welcome page"
          ]
        ],
        "\n  "
      ]
    ],
    "\n  ",
    [
      "body",
      {},
      [
        "\n    ",
        [
          "p",
          {},
          [
            "Welcome to ",
            [
              "a",
              {
                "href": "http://ibm.com/developerworks/"
              },
              [
                "IBM developerWorks"
              ]
            ],
            "."
          ]
        ],
        "\n  "
      ]
    ],
    "\n"
  ]
]

このデータ・モデルは単純です。MicroXML 要素コンテンツなどのリストが、JSON リストになっています。属性セットなどのマッピングは、JSON オブジェクトになります。1 つの要素は、3 つの項目からなるリストであり、その 3 つの項目とは (Unicode) ストリングとしての要素名、この要素の属性に対応するオブジェクト、そしてこの要素の子のリストです。リスト 1 には、データ・モデルにはないコメントが含まれていることに注意してください。


エラー・ハンドリング

どの XML パーサーまたは MicroXML パーサーの場合でも言えることですが、入力に誤りがあった場合に何が起こるのかを把握しておく必要があります。例えば、下記の不正な形式の XML の行 (第 1 回の例と同じです) をパーサーのテスト用テキスト域に貼り付けて構文解析を行います。

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

図 5 にその出力を示します。

図 5. 不正な形式の MicroXML のテスト出力
不正な形式の MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

この場合、エラー・メッセージ「Parse error: name "para" in end-tag does not match name "strong" in start-tag. (パーサー・エラー: 終了タグの名前「para」が、開始タグの名前「strong」と一致しません。)」がテキスト域の直下に表示されており、「JSON data model (JSON データ・モデル)」の下には何も表示されていません。パーサー・コードはまた、エラーの場所 (この場合は para) を強調表示しています。Clark 氏が開発したパーサーは、エラーが発生すると、エラーから復帰することはありませんが、エラー・レポートを表示して即座に停止します。これは XML 1.0 パーサーの動作とよく似ています。Clark 氏は現在、エラー・リカバリーをサポートするバージョンのパーサーの開発にも取り組んでいます。

誤って残された XML 1.0

XML 1.0 は、現在なお主要なフォーマットとして使用されており、これからも当面は主要なフォーマットであり続けることでしょう。MicroXML パーサーが出くわす最も一般的なエラーは、XML の記述が誤って残されていることによるものです。リスト 1 は、HTML5 を XML 風に見せることを意図した MicroXML です。XHTML5 では推奨されている <!DOCTYPE html> 宣言は、MicroXML では使用してはならないため、削除してあります。この文書型宣言を復活させたコードをテキスト域に貼り付けて、構文解析を実行すると、図 6 のようなエラーになります。

図 6. 文書型宣言が含まれているためにエラーとなる MicroXML のテスト出力
文書型宣言が含まれているためにエラーとなる MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

パーサーは、入力テキストの 1 文字のみを強調表示することで、エラーの場所を示しています。図 6 では、エラーの場所を強調表示するために、楕円による強調表示を追加しています。エラー・メッセージは、「Parse error: expected "-". (構文解析エラー: 「-」が必要です。)」となっています。パーサーは、「<!」の後に「--」を続けることで、コメントの構文にすることを要求しています。

XML 1.0 名前空間

発生しがちなもう 1 つのエラーは、MicroXML からは削除された XML 名前空間が残っていることによるものです。図 7 では、xmlns 属性が禁止されていることが示されています。

図 7. xmlns 属性が含まれているためにエラーとなる MicroXML のテスト出力
xmlns 属性が含まれているためにエラーとなる MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

図 7 での入力テキストは、以下のとおりです。

<doc> xmlns:="http://spam.com">
</doc>

パーサーはこの入力に対して、「Parse error: "xmlns" is not allowed as an attribute name. (構文解析エラー: xmlns は属性名として許可されていません。)」と出力しています。

図 8 では、要素名の中でコロンを使用するのは禁止されていることが示されています。

図 8. 要素名の中でコロンが使用されているためにエラーとなる MicroXML のテスト出力
要素名の中でコロンが使用されているためにエラーとなる MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

図 8 での入力テキストは、以下のとおりです。

<x:<doc> xmlns:x="http://spam.com">
<x:/doc>

パーサーはこの入力に対して、「Parse error: expected ">". (構文解析エラー: 「>」が必要です。)」と出力しています。

図 9 では、属性名の中でコロンを使用するのは禁止されていることが示されています。

図 9. 属性名の中でコロンが使用されているためにエラーとなる MicroXML のテスト出力
属性名の中でコロンが使用されているためにエラーとなる MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

図 9 での入力テキストは、以下のとおりです。

<doc xml:id='mydoc'>
</doc>

このコードは、xml 接頭辞が宣言を必要としない特別なものであることから、妥当な XML 1.0 です。しかし、MicroXML ではこの接頭辞さえも使用することはできません。というのも、コロンは属性名の中でも使用が禁止されているためです。この場合、パーサーは「Parse error: expected "=". (構文解析エラー: 「=」が必要です。)」と出力しています。

文字エラー

MicroXML では、文字を表現する方法にも制約があります。最も注目に値し、フィールド内でエラーが発生する可能性が最も高いと思われる制約は、UTF-8 以外の文字コードでのエンコードが禁止されていることです。最近は、より多くのソフトウェアが Unicode 対応となっており、UTF-8 を生成することができますが、開発者であってもそれを適切に行うのは困難な場合が今でもあります。

MicroXML では、16 進数でエンコードされた数値文字参照のみが使用可能です。図 10 では、10 進数による数値文字参照ではエラーになることが示されています。

図 10. 10 進数による数値文字参照が含まれているためにエラーとなる MicroXML のテスト出力
10 進数による数値文字参照が含まれているためにエラーとなる MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

図 10 での入力テキストは、以下のとおりです。

<doc> &#160; </doc>

構文解析エラーのテキスト「Parse error: expected "x". (構文解析エラー: 「x」が必要です。)」で示唆しているように、このエラーは 16 進数による数値文字参照の形式 (&#xA0;) に切り替えることにより、このインスタンスの中で修正することができます。

MicroXML では、図 11 のように要素や属性の中で「大なり (>) 文字」(「右山括弧」と呼ばれることもあります) を使用することも禁止しています。

図 11. エスケープされていない「大なり文字」が含まれているためにエラーとなる MicroXML のテスト出力
エスケープされていない「大なり文字」が含まれているためにエラーとなる MicroXML のテスト出力を示すブラウザーのスクリーン・キャプチャー

図 11 での入力テキスト「<doc> > <doc>」は、「Parse error: ">" characters must always be escaped. (構文解析エラー: 「>」文字は必ずエスケープする必要があります。)」という結果になります。このエラーを修正するには、「大なり (>) 文字」をエスケープして &gt; を使用するようにします。


まとめ

実用的な実装がない仕様は、ほとんど意味がありません。MicroXML を指示する人にとって、一歩踏み出して MicroXML を実装するのは重要なことでした。John Cowan 氏は先頭を切って MicroLark を作成し、James Clark 氏はコミュニティー仕様が登場すると、その仕様の最初の実装を作成しました。私は Python 3 向けにコミュニティー仕様を実装しています。開発者として私は常々、MicroXML パーサーは XML パーサーよりも学習したり、扱ったりするのが簡単であると思っています。

Clark 氏が開発したパーサーに対する JavaScript インターフェースには、十分なドキュメントがありません。このインターフェースについて深く掘り下げるには、このインターフェースからの JavaScript オブジェクト出力を扱うことから始めてください。この出力は、XML の Document Object Model (DOM) に似ていますが、一般的な Web コーディング・テクニックを使用して、はるかに容易に処理することができます。microxml-js は、独自の MicroXML アプリケーション (モバイル用途のものも含む) の開発を始めるための簡単な方法です。

参考文献

学ぶために

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

議論するために

コメント

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, Web development, Open source
ArticleID=824444
ArticleTitle=MicroXML の紹介: 第 2 回 microxml-js を使用して MicroXML の処理を行う
publish-date=08082013