XMLデータの管理: XMLドキュメントの識別

ファイル拡張子とMIMEタイプ

Comments

3文字の拡張子は、少なくとも1960年代後半からファイル・タイプの識別に使用されていて、今でも使用されています。3文字ではなく、4文字や2文字、あるいは1文字を使用するオペレーティング・システムもありますが、ファイル名+ピリオド+拡張子という基本的規則は同じです。多くの場合、ファイル名と拡張子は、異種システム間でファイルを移動する際にファイルとともに移動される唯一のメタデータです。

XMLドキュメントをファイル・システムに格納する場合は、標準のファイル拡張子を使用してください。こうすることによって、XMLファイルの検索、認識、および処理が、誰でも簡単にできるようになります。今のところ最も一般的な拡張子は.xmlですが、表1に示すように、他にも多数の拡張子がXMLの特定のサブセットで使用されています。

表1. 一般的なXMLファイル拡張子
拡張子意味
.xml汎用XMLドキュメント
.ent解析対象実体、ドキュメントの断片
.dtd文書型定義(DTD)
.rdfリソース記述フレームワーク(RDF)XML構文
.atomAtom syndication feed
.owlWeb Ontology Language
.xhtmlExtensible Hypertext Markup Language (XHTML)
.xsdW3C XML Schema Languageスキーマ
.xslXSL Transformations
.foXSL Formatting Objects
.rngREALX NG XML構文
.schSchematronスキーマ
.svgScalable Vector Graphics (SVG)
.rssRSS(Really Simple Syndication、Rich Site Summary、またはRDF Site Summary[頭字語の定義者によって異なる])syndication feed
.plistAppleのプロパティ・リスト・フォーマット

Webサーバーによって提供されるリソースは、ファイル・システムになっていないこともあります。しかし、リソースがXMLドキュメントの場合は、これらのリソースのURLが上記の拡張子の1つで終わっていて、詳細なタイプに適していることを確認するように努めてください。

MIMEメディア・タイプ

Webサーバーがファイルを送信するときには、ファイル名と内容を送信するだけではありません。リスト1に示されているように、ファイルに関する多くのメタデータもHTTPヘッダーで送信します。

リスト1. サンプルのメタデータ
HTTP/1.1 200 OK
Date: Sun, 23 Jan 2005 18:21:33 GMT
Server: Apache/2.0.52 (Unix) mod_ssl/2.0.52 OpenSSL/0.9.7d
Last-Modified: Sun, 10 Oct 2004 16:17:21 GMT
ETag: "3e06d-16a05-2dbc8640"
Accept-Ranges: bytes
Content-Length: 92677
Content-Type: application/xhtml+xml

最後の行のContent-Typeヘッダーに注目してください。このヘッダーの値(この例では、application/xhtml+xml)がMIMEメディア・タイプです(おそらく、ドキュメントの文字セットに関する任意情報が後に続きます)。Webブラウザーやその他のクライアントは、このメタデータを使用してファイルの処理方法を決めます。たとえば、ネイティブで表示できるか、ヘルパー・アプリケーションに渡さなければならないかを判断します。MIMEタイプは、電子メールや少数の実験的オペレーティング・システム、特にBeOSなど、他の文脈でも使用されています。Linuxやその他のUNIX®システムもMIMEタイプを使用しますが、ほとんどは、MIMEタイプで直接ファイルにタグを付けるのではなく、ファイル拡張子をMIMEタイプにマップしています。MIMEタイプが本当に実際的に使用されているのは、インターネットにおいてです。

汎用XMLドキュメントの基本的コンテンツ・タイプは、application/xmlです。text/xmlタイプも登録されていますが、HTTPプロトコルの他の部分との相性の問題から、このタイプは推奨されていません。(text/xmlの使用は、ドキュメントのXML宣言で別の記述があっても、ドキュメントはASCIIでコード化されていることを示します。)その他、登録されている基本的なMIMEタイプとしては、次のものがあります。

  • DTDを示すapplication/xml-dtd
  • ドキュメントの断片を示すapplication/xml-external-parsed-entity

より具体的なXMLフォーマット・タイプの場合、application/foo+xmlタイプを使用するのが規則です。"foo"は、特定のXML語彙を示します。たとえば、RDFであればapplication/rdf+xml、XHTMLであればapplication/xhtml+xml、SVGであればapplication/svg+xmlとなります。このようにして、汎用XMLプロセッサーはドキュメントをXMLとして認識することができ、しかも、特定のフォーマットのプロセッサーも認識できます。表2に、よく使われるメディア・タイプを示します。

表2. XML MIMEメディア・タイプ
メディア・タイプドキュメントのフォーマット
image/svg+xml*SVG
application/atom+xml*Atom Feed Syndicationフォーマット
application/mathml+xml*Mathematical Markup Language
application/beep+xmlBlocks Extensible Exchange Protocol
application/cpl+xmlCall Processing Language
application/soap+xmlSOAPメッセージ
application/epp+xmlExtensible Provisioning Protocol
application/rdf+xmlRDF XML構文
application/xhtml+xmlXHTML
application/xop+xmlXML-binary Optimized Packaging
application/xslt+xml*XSLTスタイルシート
application/xmpp+xmlExtensible Messaging and Presence Protocol
application/voicexml+xml*VoiceXML

*登録申請中

新しいフォーマットを作成するたびに新しいMIMEメディア・タイプを勝手に作ることはできません。新しいタイプを正式な仕様(多くの場合はIETF Request for Comment)として公開して、Internet Assigned Numbers Authority(IANA)に登録しなければなりません。ただし、実験的なサブタイプは登録せずに指定することができます。これらのサブタイプはx-で始まらなければなりません。たとえば、私の著書『XML 1.1 Bible』での例として作成したテレビジョン・リスティング・マークアップ言語のカスタム・タイプが必要になったとき、私はそれをapplication/x-tvml+xmlと呼ぶことにしました。このアプリケーション・タイプは、このファイルを非ASCIIデータとして扱うようにプロセッサーに指示します。サブタイプの末尾の+xmlは、これがXMLであることをプロセッサーに伝え、x-は、これが未登録のタイプであることを警告し、tvmlはデータの種類を伝えます。

経験則

XMLファイルを識別するための最後の手段は、ファイルを開いて見ることです。この方法は最も速い方法とは言えず、多数のXMLドキュメントの集まりについてはまったく不適切なので、このシリーズで取り上げるべきではないかもしれません。しかし、ときには、これが、ファイルまたはストリームがXMLを含んでいるかどうかを知る唯一の確実な方法です。ファイルまたはストリームをパーサーに放り込んで、うまくいくように願うこともできますが、これはかなり重量級の解決策です。最初の数バイトを見ただけで、ファイルまたはストリームがXMLかもしれないかどうかがわかるので、パーサーでさらにチェックする価値があるかどうかが分かります。たとえば、整形式のXMLドキュメントは、「より小さい」記号(<)で始まることが保証されていて、オプションで空白類が前にあることもあります。実際には、大多数のXMLドキュメントは次の3つのいずれかで始まります。

  • <?xml
  • <!DOCTYPE
  • <foofooは任意のXML名)

文字セットの問題が、検出をやや困難にしています。この3つはすべて、UTF-8、ビッグ・エンディアンUTF-16、またはリトル・エンディアンUTF-16のいずれかのUnicodeバイト・オーダー・マークが前に付いているかもしれないし、付いていないかもしれません。さらに、Unicode以外にも、ASCII、ISO-8859-1(Latin-1)、EBCDICなど、任意の数の文字セットが使用できます。それでも、これらのセットは可能な先頭文字列の文字の範囲の多くが重複するので、次のように16進で示したいくつかの一般的なバイト・シーケンスに絞り込むことができます。

  • FE FF 00 3C 00 3F
  • FF FE 3C 00 3F 00
  • 3C 3F 78 6D
  • EF BB BF 3C 3F
  • 4C 6F A7 94
  • 3C

これらの経験則は完璧なものではありません。特に、これらの経験則は、誤った形式のHTMLドキュメントをXMLの可能性があると識別してしまいます。また、最初の<(3C)の前の先頭の空白類(タブ、キャリッジ・リターン、ラインフィード、スペース)を除去するか、最初の< の後の文字が?、!、またはXMLの名前開始文字であることを確認することによって、少数の特殊ケースでの判別を改善できます。ただし、実際には、上記のシーケンスのいずれかで始まらないドキュメントは、XMLではない可能性が高いです。これらの文字を最初にチェックすれば、紛らわしいドキュメントの多くを除外でき、可能性の高いものだけを解析することによって時間を節約できます。

まとめ

どのファイルがXMLを含んでいるかを調べるもうひとつの方法は、XMLをどこに入れたかを覚えておくことです。しかし、自分が作成したアプリケーションでは、この方法でうまく行ったとしても、同じデータにアクセスする必要があるけれども、個人的なファイル名の命名規則がよく分からないアプリケーションに遭遇する場合もあります。標準的なファイル名とMIMEメディア・タイプの規則に従っていれば(あるいは、少なくとも、そこから大きく逸脱しないようにすれば)、あなたのドキュメントは誰にとってもアクセスしやすいものとなり、異種システム間でデータを交換できるというXMLの能力を大幅に高めることができます。


ダウンロード可能なリソース


関連トピック

  • RFC 2046, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types」を読んでください。この中では、タイプとサブタイプの区分や未登録タイプに対するx- 接頭辞(x- prefix)の使い方を含めて、MIMEタイプの基本構造を説明しています。
  • 公開されている、MIME type registryを見てください。これはIANAが維持管理しており、登録済みXMLタイプのすべてと、その他のタイプすべてをリストアップしています。
  • RFC 3023, XML Media Types」を調べてください。ここではXML文書に対するMIMEメディア・タイプの基本セットを記述しており、また新しいタイプを選択するためのシステムを解説しています。
  • Architecture of the World Wide Web, Volume Oneを読むと、なぜテキストがXML文書用のメディア・タイプとして不適当なのかが分かります。
  • 20年前にApple Computerは、ファイルタイプを識別するための、より良い方法として、ファイル名が2つの役割を持たない方法を発明しました。要は、各ファイルのリソース・フォークの中に、追加の4文字コードを保存するのです。Appleはこの方法をMac OS Xでやめようとしましたが、開発者の大反対にあって断念しました。現在Appleは、タイプ・コードとファイル名拡張子の両方をサポートしています。「Finder Interface」のChapter 7、Inside Macintosh: Macintosh Toolbox Essentialsも、この方法について説明しています。
  • Be, Inc.は無くなってしまったかも知れませんが、MIMEベースのファイルシステムなど全てを網羅したHaikuプロジェクトでは、BeOSを試すことができます。
  • Elliotte Rusty Harold著によるXML 1.1 Bibleを読んでください。この本もAmazon.comで購入できます。
  • XMLおよび関連技術においてIBM認証開発者になる方法については こちら を参照してください。

コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=XML
ArticleID=241029
ArticleTitle=XMLデータの管理: XMLドキュメントの識別
publish-date=04292005