XMLの世界

1.XMLとは

2.DTD

3.XMLパーサ

4.XSL (2000.10.09 サンプル追記)

5.XSLT

6.XMLの優位点

7.DOMとSAX API

8.スキーマ論争(2001.05.14追記)

9.関連リンク集

10.付録 : マイクロソフトのXMLDOM (2001.01.08追記)

11.参考 : CSVをXMLに変換 (2000.11.18追記)


1.XMLとは

 「eXtensible Markup Language」の略。テキストベースのタグ付きフォーマットを定義するためのメタ言語。SGMLから派生したという意味ではHTMLと同様ですが、HTMLとは異なり用途に応じて定義した独自のタグを使用できます。HTMLが専らWebブラウザ上の表現を定義するものですが、XMLは各種のデータインタフェースを定義するものとして注目を浴びています。

XML1.0の勧告 = http://www.w3.org/TR/REC-xml
ドラネコ氏によるXML仕様書翻訳版 = http://doraneko.org/xml/

 XMLは名前だけ先行して、では一体何が出来るのかと当初戸惑いも見られましたが、ブラウザではIE(Internet Explore)がversion5以降で先行して表示機能をサポートしたこともあり、実用の段階に近づいたと言えます。ジャストシステムの一太郎やマイククロソフトのオフィスでも対応が成されており、その実用化は既にユーザー側の取組みの問題になりつつあります。

<?xml version="1.0" encoding="Shift_JIS"?>
<RECORD>
  <TITLE>Piano Concert No.5</TITLE>
  <COMPOSER>Beethoven</COMPOSER>
  <ARTIST>Kempff</ARTIST>
</RECORD>

 尚、上の例では一行目のXML宣言を除いては本体=XMLインスタンスとなっていますが、この間に次項で説明する文書型宣言 = DTDを挿入する場合があります。あるいはDTD自体は別ファイルとし、ファイル名を明示する方法もあります。


2.DTD

 さてXMLはタグが自由に定義出来ると言いましたが、DTD(Document Type Definition)はその文書構造を定義するものです。例えば前出のXMLのDTDは下のようなものとなります。このDTDがあることにより当該XMLが規則通り記述されているかのチェックを可能とします。ところがXMLではDTDを必須とはしませんでした。DTDが有って且つDTDの定義通りに記述されたXMLを検証済みXML或いは妥当なXML(Valid XML)と呼びますが、DTDが無くても開始タグと終了タグの対応がとれており、親子関係にある要素のタグがきちんと入れ子になっているXMLをウェルフォームド(well-formed) XML或いは整形式XMLと呼んでいます。

<!DOCTYPE RECORD [
<!ELEMENT RECORD (TITLE, COMPOSER, ARTIST)>
<!ELEMENT TITLE (#PCDATA)>
<!ELEMENT COMPOSER (#PCDATA)>
<!ELEMENT ARTIST (#PCDATA)>
]> 

http://www.w3.org/XML/1998/06/xmlspec-report-v20.htm


3.XMLパーサ

 XML文書がDTDの定義通りに記述されているか、或いはタグの入れ子関係が正しいかを調べるのがXMLパーサと呼ばれるソフトです。既にIBM社(サイトは下記参照)等からフリーで提供されています。

XML Parser for Java(IBMのXMLパーサ)
Xerces Java Parser(Apacheのプロジェクト)

 XercesはApacheプロジェクトのXMLパーサですが、実はIBMのソースを元に作られています。動かしてみると判りますが、GUIベースで作られた見栄えの良いパーサソフトです。

 IE5を使っているWindowsユーザーの場合マイクロソフトのXMLパーサが既に自動的にインストールされています。MSXML.DLLがそれですが、IE5から適時呼ばれて構文チェックを担っています。


4.XSL

 eXtensible Stylesheet Languageの略。XMLは前にも触れたようにWebブラウザ上での表現を定義するものではありません。そこで表現を定義するにはスタイルシートを用いることになりますが、このXSLがXMLに用いるスタイルシートです。IEで試してみるとすぐに判りますが、XSLが無いXMLでもパーサでエラーが発見されなければブラウザ上に表示されます。しかしそれは単にXMLがそのまま表示されるという類のもので、Web上のコンテンツとはなり得ていません。

Bruckner_2.xml (IE5でのみ表示可能)

しかしXSLがあればWebページとして様々な見栄えのよいコンテンツを表示することが可能となります。

Bruckner.xml ( + Bruckner.xsl IE5でのみ表示可能) 

 IE5の使えない方向けに上のBruckner.xmlでどのように見えるのかを挙げておくと、
title player version
Bruckner Sym No.8 セル=クリーブランド ノヴァーク
Bruckner Sym No.8 朝比奈隆=大阪フィル ハース
というブルックナー表です。


5.XSLT

 XSL Transformationsの略。XMLの変換機能をサポートする機能グループのこと。XMLとXSLファイルの双方が有る場合、このXSLT機能によってHTMLを生成することが可能となります。前項で説明したようにIEではXML+XSLでHTML生成後のWebページが見える訳で当然XSLT機能を内包していることになります。正確にはMSXML.DLLにXSLTプロセッサが内蔵されています。XSLTについての詳しい情報は下記URLを参照して下さい。

http://www.xslt.com/
http://www.infoteria.com/jp/contents/xml-data/REC-xslt-19991116-jpn.htm


 それからオープンソースのXSLTプロセッサもあるようである。興味のある方は下記URLを見て下さい。

Sablotron is a fast, compact and portable XSLT processor written in C++.
Sablotron is maintained as an Open Source project

http://www.gingerall.com/

http://www.blnz.com/xt/index.html (XT)


6.XMLの優位点

 さて上で挙げているブルックナー表はXMLでは下のようになっています。

<SampleDB>
 <Sample title="Bruckner Sym No.8">
  <player>セル=クリーブランド</player>
  <version>ノヴァーク</version>
 </Sample>
 <Sample title="Bruckner Sym No.8">
  <player>朝比奈隆=大阪フィル</player>
  <version>ハース</version>
 </Sample>
</SampleDB>

 一方これをCSVで表わすと次のようです。

title,player,version
Bruckner Sym No.8,セル=クリーブランド,ノヴァーク
Bruckner Sym No.8,朝比奈隆=大阪フィル,ハース

 この例のように項目数が少ない場合はそうでもありませんが、項目数が増えた場合にどちらが判りやすいかはすぐ判ると思います。確かにCSVの場合は容量が少ないのですが、ネットワークが高速化されてきた今にあっては容量がコンパクトであることよりも、判り易いという利点の方が重要になってきたのです。


7.DOMとSAX API

 XML用のAPIとしてはDOMSAXが有名で既に両者が標準の地位を確保しています。

DOM (Document Object Model)
 これはツリー構造に基づくAPIであり、1998年10月にW3Cから勧告が公開されています。ツリー構造に展開するため、メモリー消費が多いという問題はあります。

W3CのDOMページ = http://www.w3.org/DOM/
 (2000/11/13にLevel2もアナウンス済み)

DOM Level-1 = http://www.w3.org/TR/REC-DOM-Level-1/

Level1 Javaメソッド = http://www.w3.org/TR/REC-DOM-Level-1/java-language-binding.html

Level1 ECMAScriptメソッド = http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html

ドラネコ氏によるDOM仕様書翻訳版 = http://doraneko.org/misc/dom1/cover.html

浅海智晴氏のDOMプログラミング虎の巻 =
http://www.asahi-net.or.jp/%7EDP8T-ASM/java/articles/XMLJava2/article.html

Javaで実現するDOM/SAXプログラミング (@IT) = http://www.atmarkit.co.jp/fxml/rensai/xmljava01/xmljava01.html

SAX (Simple API for XML)
 イベント駆動型のAPI。DOMのようにメモリ上のツリー構造を展開することはありません。それゆえ消費メモリも多くありません。DOMがW3Cでまとめられたのに対し、SAXはメギンソン氏らがメーリングリストで議論を重ね考案したAPIです。

SAX by Mr.Megginson = http://www.megginson.com/SAX/


8.スキーマ論争

 ここでスキーマ論争と言っているものはDTDの問題に派生して持ち上がっている論争のことです。DTDの問題については別頁にも書いていますが、次のようなものです。

(1) DTD自身がXML文書でなく、文法が独特である。

(2) データ形式を定義できない。

(3) 名前空間が使えない。

 これらの問題に対応するため、W3CではXML Schemaの勧告をまとめ先日発表しました。しかしこれについては、内容が複雑で実用にはならないとの批判があります。そこでXML Schemaの勧告前に日本国内で制定されたのが、RELAXです。

http://www.xml.gr.jp/relax/

 これ自体は日本発の標準ながら世界標準となることを目指し、しかもXML Schemaのように複雑となることを避けた点である程度の評価は出来ます。しかし、いざXML Schemaが勧告されてしまうと、何を使うべきなのか問題となります。XMLの使い方によっては元々のDTDで十分というユーザーも当然居るのでしょうから、何を採用するのかはユーザーに依存され、当面どこかに集約することはないのかも知れません。どちらにしても複数の技術が並列の状態となる訳であり、好ましい状況とは言えない現状です。以下参考リンク。

スキーマ戦争

DTD2XS

@ITのXMLスキーマ

スキーマ検証ツール

XMLschemaでパース


9.関連リンク集

XML用語辞典 = http://www.atmarkit.co.jp/fxml/dictionary/indexpage/xmlindex.html

DTD作成作業の源Biztalk = http://www.biztalk.org/

インフォテリア社のXML資料室 = http://www.infoteria.com/jp/contents/xml-data/index.html

Kyssプロジェクトのページ = http://user.shikoku.ne.jp/kyss/

ash Multimedia labのxmlページ = http://www.ash.or.jp/xml/index.htm

XML eXpert eXchange = http://www.atmarkit.co.jp/fxml/

XMLが変えるオブジェクト技術(浅海 智晴) = http://www.asahi-net.or.jp/~dp8t-asm/java/articles/XMLJava/article.html

楽しいXML(万葉集) = http://www.cityfujisawa.ne.jp/~yanai/xml/index.html

XML横丁のXMLリンク集 = http://www.bisket.com/xml_street/xml_link/xml-links/xml/xmlresources.htm

Javaコンソーシアムのリンク集 = http://www.javacons.gr.jp/xml/xmllinks.htm

XML関係ソフトのダウンロード = http://www.vector.co.jp/vpack/filearea/win95/net/htmledit/xml/index.html

これから始める人のXMLガイド = http://software.nikkeibp.co.jp/software/backno/00xmlmook1.html

横浜ベイキットのXMLサーバー = http://www.baykit.org/

5分で判るXML = http://www.keyman.or.jp/cgi-bin/get_doc.pl?go_url=/cgi-bin/rperl5.pl/keynavi/allthats/130969.html&memid=demo&keyid=999999&from=&prodid=130969&pf=3&log=view/130969

@ITのXML = http://www.atmarkit.co.jp/fxml/index.html

XMLリンク = http://kawacho.don.am/bookmark/xml.html

XPath = http://www.doraneko.org/xml/xpath/

XMLセキュリティの勉強 = http://www.atmarkit.co.jp/fxml/tanpatsu/16xmlsecurity/xmlsecurity01.html


10.付録 : マイクロソフトのXMLDOM(2001.01.08)

 XMLがこれだけ短期間で受入れられてきた最大の理由は汎用性が高くオープンな環境に置かれている点かと思います。その意味ではやはりマルチプラットフォームで汎用性の高いJavaとの親和性が高いと考えられます。事実、Java用のXMLパーサやDOM、SAX用のクラスファイルは早くから整備され、最も注目すべき開発環境だと考えられます。更にはJDOMといった新しいAPIも進行中であり、Javaを選択しない理由は見当たりません。

 ブラウザの現状を見るとNetscape6でのXML対応は十分とは言えず、マイクロソフト社のIE5のみが使用に耐えるという厳しい状況にあります。ブラウザで表示するのであればXML+XSL+IE5というのが現状考えられる唯一の選択肢と言っても過言ではありません。IE5の場合機動性を持たせるために、VBscriptJscriptを付加利用することが考えられます。

 一方サーバーサイドを考えると前述したような理由からJavaサーブレットを選択するのが常識的な選択と考えられます。ORACLE社などのRDBベンダーはDOM、SAXに加えて各社独自のXML用Javaクラスを提供しており、Javaの利用をより促進しています。しかしながらブラウザの対応状況に合わせサーバー側でもVBscript等を利用したいという要望もあるかと思います。これはサーバーがIIS等であれば可能です。この場合サーバーではVBscript等でマイクロソフト社版DOMであるXMLDOMのオブジェクトを生成して行なうこととなります。ここではその方法論を簡単にまとめておきます。

(1) 前提条件

 ここではASPでサーバー側に新規のXMLファイルを生成します。言語はVBscriptととし、取り敢えず次の変数宣言をしておきます。

dim xmldata,bookElement,bookName

(2) XML文書の雛形作成

 XMLDOMのオブジェクトを生成し、XML文書の雛型をロードします。

Set xmldata = createObject("Microsoft.XMLDOM")
xmldata.async = false
xmldata.loadXML("<?xml version='1.0'?><xmlroot/>")

 2行目は非同期処理を不可にし、読込み終了までパーサが次の処理を行なうことを抑制します。

(3) DOMツリーの作成

createElementメソッドを使ってデータを入れる子要素を作成します。

set bookElement = xmldata.createElement("本の名前")

appendChildメソッドで新しい要素をルートに追加します。

xmldata.documentElement.appendChild(bookElement)

(4) DOMツリーにデータをセット

テキストノードにデータをセットすることでDOMツリーにデータを追加します。

set bookName = xmldata.createTextNode("三四郎")
bookElement.appendchild(bookName)

これによって作られるXMLは次のようになります。

<?xml version="1.0"?>
<xmldocument><本の名前>三四郎</本の名前></xmldocument>

(5) マイクロソフト関連のリンク集

  マイクロソフト社の初心者のための XML DOM ガイド = http://www.microsoft.com/japan/developer/workshop/xml/articles/beginner.asp

  マイクロソフトのXMLDOMリファレンス = http://msdn.microsoft.com/xml/reference/xmldom/start.asp

  XMLDOM日本語簡易リファレンス = http://www.ash.or.jp:7080/ash/xml/dom/index.htm

  マイクロソフトのXML資料(英文) = http://msdn.microsoft.com/xml/xmlguide/default.asp

  XMLデベロッパーセンター = http://www.microsoft.com/japan/developer/xml/default.asp


11.参考 : CSVをXMLに変換

 ここでは参考としてJGAWKを使ったCSVからXMLへの変換を示します。元となるCSVファイルは上でも出てきた次のようなものです。

Bruckner.csv
title,player,version
Bruckner Sym No.8,セル=クリーブランド,ノヴァーク
Bruckner Sym No.8,朝比奈隆=大阪フィル,ハース

 これを下のようなAWKスクリプトを使ってXMLに変換します。(ソースは全角スペースでインデントしています。)

csvtoxml.awk
BEGIN {
 FS="," ;
 printf ("%s%s\n","<?xml version=\x22","1.0\x22?>\n")
}
NR==1 {
 fn = FILENAME;
 fn = substr(fn,1,length(fn)-4);
 for(i=1;i<=NF;i++) {element[i] = $i}
 printf("<%sDB>\n",fn);
}
NR!=1 {
 for(i=1;i<=NF;i++) {
  if(i==1){
  printf("\n\t<%s %s=\x22%s\x22>\n",fn,element[i],$i);
  } else {
  printf("\t\t<%s>%s</%s>\n",element[i],$i,element[i]);
  }
  if(i==NF){
   printf("\t</%s>\n",fn);
  }
 }
}
END { printf("\n</%sDB>\n",fn);}

JGAWK -cxsvtoxml.awk Bruckner.csv > Bruckner.xml

これによって次のxmlが生成されます。

Bruckner.xml
<?xml version="1.0"?>

<BrucknerDB>
 <Bruckner title="Bruckner Sym No.8">
  <player>セル=クリーブランド</player>
  <version>ノヴァーク</version>
 </Bruckner>
 <Bruckner title="Bruckner Sym No.8">
  <player>朝比奈隆=大阪フィル</player>
  <version>ハース</version>
 </Bruckner>
</BrucknerDB>

これはxmlとして十分なものですが、Web上での表現力に問題があります。そこで次のスクリプトでxslを生成します。

csvtoxsl.awk
BEGIN {
 FS="," ;
 printf ("%s%s\n","<?xml version=\x22","1.0\x22?>\n");
 printf ("<xsl:stylesheet\n");
 printf (" xmlns:xsl=\x22http://www.w3.org/TR/WD-xsl\x22\n");
 printf (" xmlns=\x22http://www.w3.org/TR/REC-html40\x22\n");
 printf (" result-ns=\x22\x22>\n\n");
 printf ("<!-- Root template -->\n");
 printf ("<xsl:template match=\x22/\x22>\n<HTML>\n\t<HEAD>\n");
 printf ("\t\t<TITLE>XML data from CSV</TITLE>\n");
 printf("\t</HEAD>\n\t<BODY>\n\t<CENTER>\n");
 printf("\t<H3>XML Data from CSV</H3>\n\t<TABLE BORDER=\x22");
 printf("1\x22 >\n\t<TR>\n");
}
NR==1 {
 inf = NF;
 fn = FILENAME;
 fn = substr(fn,1,length(fn)-4);
 for(i=1;i<=NF;i++) {element[i] = $i}
}
END {
 for(i=1;i<=inf;i++) { printf("\t\t<TD><B>%s</B></TD>\n",element[i])}
  printf("\t</TR>\n");
  printf("\t<xsl:for-each select=\x22%sDB/%s\x22>\n",fn,fn);
  printf("\t<TR>\n");
  for(i=1;i<=inf;i++) {
   if(i==1){
    printf("\t\t<TD><xsl:value-of select=\x22@%s\x22/></TD>\n",element[i])
   } else {
   printf("\t\t<TD><xsl:value-of select=\x22%s\x22/></TD>\n",element[i])
   }
 }
 printf("\t</TR>\n");
 printf("\t</xsl:for-each>\n\t</TABLE>\n\t</CENTER>\n\t</BODY>\n");
 printf("</HTML>\n</xsl:template>\n</xsl:stylesheet>");
}

JGAWK -fcsvtoxsl.awk Bruckner.csv > Bruckner.xsl

これで生成されるxslが次のものです。

<?xml version="1.0"?>

<xsl:stylesheet
xmlns:xsl="http://www.w3.org/TR/WD-xsl"
xmlns="http://www.w3.org/TR/REC-html40"
result-ns="">

<!-- Root template -->
<xsl:template match="/">
<HTML>
 <HEAD>
  <TITLE>XML data from CSV</TITLE>
 </HEAD>
 <BODY>
 <CENTER>
 <H3>XML Data from CSV</H3>
 <TABLE BORDER="1" >
 <TR>
  <TD><B>title</B></TD>
  <TD><B>player</B></TD>
  <TD><B>version</B></TD>
 </TR>
 <xsl:for-each select="BrucknerDB/Bruckner">
 <TR>
  <TD><xsl:value-of select="@title"/></TD>
  <TD><xsl:value-of select="player"/></TD>
  <TD><xsl:value-of select="version"/></TD>
 </TR>
 </xsl:for-each>
 </TABLE>
 </CENTER>
 </BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>

このxslを利用するためにはxml側の2行目に下のものを追加します。

<?xml-stylesheet type="text/xsl" href="Bruckner.xsl"?>

そうして出来たxmlとxslをIE5で参照するとBruckner.xmlのようになります。


前ページに戻る---> RETURN