連載
» 2001年11月02日 00時00分 公開

技術者のためのXML再入門(2):XMLデータの構造、表示、そして変換

XMLデータを処理する際に必ず登場するのがXMLプロセッサ(XMLパーサ)だ。開発者はXMLデータの構造のチェックなどをXMLパーサに任せることができる。今回はそのXMLパーサの役割について触れた後、XML関連技術についての解説を始める。まずは、XMLの構造を決定するスキーマ言語と、XMLを表示・印刷するための技術について取り上げる。

[吉田稔,日本ユニテック]

 XMLは、あくまでコンテンツを記述するためのデータフォーマットにすぎない。従って、XMLデータ(注)を利用するためには、XMLデータの印刷・表示やデータ構造変換など、XMLを処理するさまざまな技術が必要になる。そして、その技術が標準化されていれば、アプリケーションを開発するにあたり、プラットフォームが異なっても共通した手法を使えるので、プログラム開発がずっと容易になる。

(注)W3CによるXMLの仕様書では、XMLで記述された情報を「XML文書(XML Document)」と呼んでいる。しかしXMLは、電子書籍などの文書以外に、電子商取引などのさまざまなデータの記述に用いられる。そこで、本連載ではXMLで記述された文書やデータを総称して「XMLデータ」と呼ぶことにする。


 World Wide Webのための標準化団体W3Cは、XMLを利用するための技術(本稿ではXML関連技術と呼ぶ)の標準化を進めている。今回と次回の2回にわたり、W3Cが標準化したXML関連技術の中でも特にXMLのコアに近い技術を概説する。XMLにかかわる技術者が必ず出くわす用語や手法が出てくるので、その意味を明確に把握していただくのが目的だ。

XMLの処理の流れ

 XML関連技術を説明するにあたり、XMLのデータ処理で必ず利用するツールの話をしておこう。それはXMLプロセッサ(XMLパーサと呼ぶこともある)だ。XMLプロセッサによる処理の流れを図1に示す。

図1 XMLプロセッサによる処理の流れ 図1 XMLプロセッサによる処理の流れ

 XMLプロセッサはXMLデータを読み込んで、それがXMLの文法規則に合うかどうかをチェックする。さらに厳密なチェックとして、そのXMLデータのデータ構造を規定しているファイル(後述するDTDファイルなど)と照らし合わせ、データ構造の検証まで行うこともある。

 XMLプロセッサは、チェックの済んだXMLデータを、処理しやすいツリー構造に展開してからアプリケーションプログラムに渡す。アプリケーションプログラムは、渡されたツリー構造のXMLデータ(XMLツリーと呼ぶ)を操作して処理を続行する。

 XMLプロセッサは多く出回っており、しかも無料で配布されているものが少なくない。開発者は、XMLデータの構文チェックはXMLプロセッサに任せ、アプリケーションの開発に集中できるので、負担が少なくて済む。

 代表的なXMLプロセッサを以下に挙げる。

MSXML
マイクロソフトが開発したXMLプロセッサ。Internet Explorerの4.0以上が必要。
MSDN XML Developer Center


Xerces
Apache XML Project が提供しているXMLプロセッサで、Java、C++、Perl、およびCOMインターフェイスから利用できる。IBMが同社のXML Parserをオープンソースに提供したものなので、本質的にIBMのものと同一。ザーセスと読む。
xml.apache.org


XML Parser for Java
IBMが提供するXMLプロセッサ。 名前の通り、100% Pure Java対応。
alphaWorks - XML Parser for Java


Oracle XML Parser
オラクルが提供しているXMLプロセッサ。Oracle XML Developer's Kitとして配布されている。Javaおよびオラクルの提供するプログラミング言語PL/SQLが利用できる。
Oracle Technology Network - テクノロジー XML


XP
James Clark氏が提供しているXMLプロセッサ。
XP - an XML Parser in Java


主なXML関連技術を分類する

 アプリケーションプログラムは、XMLプロセッサから渡されたXMLツリーを処理してユーザーにサービスを提供する。その際、電子商取引にせよ、ナレッジマネジメントにせよ、以下の手法のいくつかを組み合わせてサービスが提供されることが多い。

  • XMLのデータ構造を規定する技術
  • XMLデータを表示・印刷する技術
  • XMLデータの構造を変換する技術
  • XMLデータ同士をリンクする技術
  • プログラムからXMLツリーを操作するためのAPI
  • そのほか

 それぞれの技術について、以下に解説する。

XMLのデータ構造を規定する技術

 XMLでは、タグの名前やタグ付けされた要素の階層構造を自由に決められるのが特徴だ。しかし、各自が自分にしか分からないタグ付けのルールを使っていては、他者とのデータ交換が不可能になる。XML形式のデータを企業・団体間でやりとりするためには、XMLデータを構成する個々の要素の名前や要素内容のデータ型、さらに要素同士の親子関係をきちんと設計し、人間やシステムが理解できる言葉で表現しておく必要がある。こうして設計されたXMLのデータ構造のことを、XMLの世界ではスキーマ(Schema)と呼ぶ。またスキーマを記述するための言語をスキーマ言語と呼ぶ(スキーマ言語で記述したファイルのことをスキーマと呼ぶこともある)。よく利用されるスキーマ言語には以下のものがある。

DTD

 最も一般的だったXMLのスキーマ言語は、DTD(Document Type Definition:文書型定義)だ。DTDは、XMLの親規格であるSGMLのころから使われてきたスキーマ言語で、1998年にXML文法が策定されたときにもスキーマ記述のためにDTDが使われた。

 DTDのイメージを持っていただくため、DTDによる簡単な記述例を示そう。まず、リスト1のXMLデータを見ていただきたい。

<?xml version="1.0" encoding="shift_jis"?>
<memo>
  <title>遠足のお知らせ</title>
  <para>社内遠足の予定が決まりました。詳しくは社内広報をご覧ください。</para>
</memo>
リスト1 サンプルXMLデータ(社内メモ)

 このXMLデータのデータ構造を図示すると図2のようになる。

図2 社内メモのデータ構造 図2 社内メモのデータ構造

 このデータ構造をDTDで記述するとリスト2のようになる。

<!DOCTYPE memo [
<!ELEMENT memo (title,para)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT para (#PCDATA)>
]>
リスト2 社内メモのDTDによる記述

 DTDは、XMLとは異なる文法で記述されていることにお気付きいただけただろう。ここで、最上位要素がmemo要素であること、memo要素の子要素としてtitle要素とpara要素がこの順番で出現すること、さらにtitle要素とpara要素の要素内容は、文字データであること(“#PCDATA”というキーワードがそのことをいっている)がDTDの文法で表現されている。

XML Schema

 XMLの世界で「DTD」というと「スキーマファイル」のことを意味するくらい、DTDはスキーマ記述のために広く使われてきた。しかし、XMLの用途が広がるにつれて、SGMLから引き継いできたDTDでは力不足な点がいくつも出てきた。これらの問題点をクリアするため、W3Cによって策定されたスキーマ言語がXML Schemaだ。

 XML Schemaには、DTDにはない次のような特徴がある。

  • 複数のスキーマを混在させるために必要なXML名前空間を使用できる
  • XMLの文法で記述できる
  • 要素の内容や属性値のデータ型を詳細に指定できる

 リスト2のDTDをXML Schemaで記述し直すとリスト3のようになる。

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="title" type="xsd:string"/>
  <xsd:element name="para" type="xsd:string"/>
  <xsd:element name="memo">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="title"/>
        <xsd:element ref="para"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
リスト3 社内メモのXML Schemaによる記述

 XML Schemaでは、データ構造がすべてXMLデータとして表現されているため、DTDよりもかなりコードが長くなる。しかし、XML Schemaの表現力はDTDに比べてかなり強力だ。文字列や10進数や浮動小数点や日付など、サポートするデータ型が豊富なうえ、m回以上かつn回以下出現する要素(m、nは整数)の指定や、例えば“〒xxx-xxxx”(xは文字)という書式の郵便番号を要素内容に持つ場合の書式指定など、これまでDTDでは不可能だった細かい表現が可能だ。XML Schemaは、2001年5月にW3C勧告になったばかりだが、今後のXML利用に重要な影響を与えるだろう。

RELAX NG

 W3Cによって定められた規格ではないが、DTDに代わるスキーマ言語として日本から提案されたスキーマ言語の1つにRELAX(REgular LAnguage description for XML)がある。RELAXは、仕様が巨大で難解なXML Schemaと異なり、理解しやすい規格といわれている。現在は、TREX(Tree Regular Expressions for XML)というスキーマ言語との融合化が図られ、RELAX NGとして標準化が進められている。

XMLデータを表示・印刷する技術

 DTDの説明で使ったXMLデータ(リスト1)をもう一度、見ていただきたい。この社内メモを紙に出力すれば、図3のようなイメージになるだろう。

図3 社内メモの紙への出力イメージ 図3 社内メモの紙への出力イメージ

 リスト1と図3を見比べるとお分かりになるように、タイトル「遠足のお知らせ」という文を中央ぞろえにする指定や、タイトルや本文のフォントの種類・サイズなど、図3の出力を得るのに必要となる文書のスタイル情報はリスト1のXMLデータのどこにもない。

 一般にXMLデータはコンテンツ情報だけからなり、スタイル情報は持たない。従って、XMLデータを印刷したりブラウザで表示したりするには、スタイル情報を何らかの方法で付与することが必要になる。

 XMLデータにスタイル情報を付与して表示・印刷する方法は主に3つある。

  • CSSでスタイルを定義して表示・印刷する
  • XSLTでHTMLに変換して表示・印刷する
  • XSLTでXSLのフォーマッティングオブジェクトに変換してから表示・印刷する

 それぞれの方法を以下に説明する。

CSS

 文書の見栄えを指定するデータをスタイルシートと呼ぶが、HTMLのためのスタイルシートを記述する言語がCSS(Cascading Style Sheet)だ。CSSを転用して、XMLデータをブラウザ表示・印刷するときに使うというのが、ここで紹介する方法だ。具体的にいうと、CSSは、HTMLでマーク付けした個々の要素についてレイアウト情報を指定する。それと同様に、XMLでマーク付けした1つ1つの要素の見せ方をCSSで指定するわけだ。CSSは、XMLの構造を変換する機能はないので、簡単なスタイルづけだけで済む場合に利用できる。

XSLT

 XMLデータの構造変換を指定する言語XSLT(Extensible Stylesheet Language Transformations)を利用する方法もある。XSLTを使えば、XMLの要素名や属性名や要素の階層構造などを変換できる。そこでXSLTによってXMLの要素をHTML要素に置き換えてやれば、ブラウザでの表示が可能なる。現在のところ、これがXMLデータをブラウザに表示させる最も一般的なやり方だ。

XSL

 XSL(Extensible Stylesheet Language)は、XMLで記述された文書に対して商用印刷レベルの詳細なスタイルづけを行うための規格だ。XSLによるスタイルづけは、以下に示す処理によって行われる(図4)。

図4 XSLによるスタイル指定のための処理の流れ 図4 XSLによるスタイル指定のための処理の流れ

 図4に示したとおり、XSLによるスタイル指定は、

  • 印刷・表示したい元のXMLツリーを構造変換して、スタイル情報を付与したツリー(XSL-FOツリー)を新たに作成する
  • そのツリーを、XSL-FO対応の印刷・表示エンジンに渡し、出力機器に印刷・表示させる

 の2段階の処理からなる。従ってXSLの規格は、次の2つの部分からなる。

  1. XMLツリーの構造変換の仕方をどのように記述するかを定めた規格
  2. ページ・段落・表などの表示対象や色・位置などの表示対象の性質を、どんな要素や属性で表現するかを定めた規格

 前者は、印刷・表示以外の用途でも汎用的な使い方ができるため、XSL規格から独立してXSLTという規格になった。また、後者の規格が定めている要素のことをフォーマッティングオブジェクト(Formatting Object)と呼び、規格そのものはXSL-FOと呼ばれることがある。XSLとXSLTという用語が混同して用いられることがあるが、XSLは両者の規格の総称として理解しておけばよい。

 XSLは、2001年10月にW3Cによる勧告になったばかりの規格だ。現時点でXSLの実装は限られているが、今後、実装が進むことが期待されている。

XMLデータの構造を変換する技術

 XMLの実務では、あるXMLデータを別の構造のXMLデータに変換する必要が生じることがある。この用途のためW3Cが標準化した、XMLのデータ構造の変換ルールを記述するための言語がXSLTだ。

 前述したとおり、XSLTは、XMLの表示・印刷のためにXSLの規格から切り出されたもので、もともとはスタイルづけを記述するための言語だった。そのため、XSLTで書いたプログラムのことをスタイルシートと呼ぶ。しかし、XSLTはスタイルづけ以外のさまざまな用途で用いられる。

 例えば、異なるスキーマ(すなわちタグセット)を使用する企業・団体間でXMLのデータ交換をする場合、各社独自のデータフォーマットを使ったXML形式のデータを、両者のシステムが共通して扱える業界標準のフォーマットに構造変換してからやりとりすることが必要だ。そのための変換ルールをXSLTで記述し、XSLTスタイルシートの実行エンジン(XSLTプロセッサと呼ぶ)に構造変換させる(図5)。

図5 企業間のデータ交換をXSLTで実現する 図5 企業間のデータ交換をXSLTで実現する

 業界の垣根を越えてデータ交換するため、さらに別のフォーマットでデータ交換が必要になるケースもあるだろう。その場合でも、構造変換にXSLTを利用していれば、プログラムを変更することなくスタイルシートを切り替えるだけで事足りる。

 XSLTは、XMLの普及に伴って大いに利用されることになるだろう。Windowsの場合、簡単な環境設定を行えば、IE 5.xとテキストエディタだけでXSLTスタイルシートの作成・実行ができる。XSLTのスタイルシートが少しでも書けるようになれば、簡単なXMLの処理をしたいとき手軽に行えるので、何かと便利だろう。@ITをはじめとしてXSLTのチュートリアルの記事は多い。参考書や雑誌でもXSLTを紹介した記事をよく見かける。さらに本連載でもXSLTスタイルシートを実際に書く方法を取り上げる予定だ。それらを参考にしていただきたい。

今回のまとめ:スキーマ、スタイル、構造変換

 今回は、XMLを実際に「動かす」ための関連技術としてスキーマ、表示・印刷、構造変換について述べた。次回は、続きとしてXMLのためのリンク技術、API技術、W3CによるXML照会言語などそのほかの技術を解説する予定だ。



Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。