レベル: 中級 Elliotte Rusty Harold (elharo@metalab.unc.edu), Adjunct Professor, Polytechnic University
2005年 4月 29日 XMLファイルの名前は、.xmlで終わる必要はありません。実際、XMLドキュメントは、ファイルとは限りません。データベース・レコード、ファイルの断片、ディスクに書き込まれていないメモリ内の一時的なバイト・ストリーム、または複数のファイルの組み合わせということもあります。しかし、XMLドキュメントの多くは、ハード・ディスクやその他の固定メディアにあります。その場合、それらのXMLドキュメントを簡単に識別できると便利です。この記事では、XMLドキュメントでよく使われるファイル拡張子とMIMEメディア・タイプについて述べます。ときには、新しい規則を考え出すよりも、大勢に準じる方が簡単なこともあります。
3文字の拡張子は、少なくとも1960年代後半からファイル・タイプの識別に使用されていて、今でも使用されています。3文字ではなく、4文字や2文字、あるいは1文字を使用するオペレーティング・システムもありますが、ファイル名+ピリオド+拡張子という基本的規則は同じです。多くの場合、ファイル名と拡張子は、異種システム間でファイルを移動する際にファイルとともに移動される唯一のメタデータです。
XMLドキュメントをファイル・システムに格納する場合は、標準のファイル拡張子を使用してください。こうすることによって、XMLファイルの検索、認識、および処理が、誰でも簡単にできるようになります。今のところ最も一般的な拡張子は.xmlですが、表1に示すように、他にも多数の拡張子がXMLの特定のサブセットで使用されています。
表1. 一般的なXMLファイル拡張子
|
拡張子
|
意味
| | .xml | 汎用XMLドキュメント | | .ent | 解析対象実体、ドキュメントの断片 | | .dtd | 文書型定義(DTD) | | .rdf | リソース記述フレームワーク(RDF)XML構文 | | .atom | Atom syndication feed | | .owl | Web Ontology Language | | .xhtml | Extensible Hypertext Markup Language (XHTML) | | .xsd | W3C XML Schema Languageスキーマ | | .xsl | XSL Transformations | | .fo | XSL Formatting Objects | | .rng | REALX NG XML構文 | | .sch | Schematronスキーマ | | .svg | Scalable Vector Graphics (SVG) | | .rss | RSS(Really Simple Syndication、Rich Site Summary、またはRDF Site Summary[頭字語の定義者によって異なる])syndication feed | | .plist | Appleのプロパティ・リスト・フォーマット |
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+xml | Blocks Extensible Exchange Protocol | | application/cpl+xml | Call Processing Language | | application/soap+xml | SOAPメッセージ | | application/epp+xml | Extensible Provisioning Protocol | | application/rdf+xml | RDF XML構文 | | application/xhtml+xml | XHTML | | application/xop+xml | XML-binary Optimized Packaging | | application/xslt+xml*
| XSLTスタイルシート | | application/xmpp+xml | Extensible 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はデータの種類を伝えます。
経験則
 |
text/xsl MIMEタイプを勝手に作り上げた最も悪名高い例は、Microsoft® Internet ExplorerがXSLTスタイルシートの識別に使用しているtext/xsl擬似タイプです。このタイプは、Microsoftの想像力の中だけの存在です。このようなタイプはIANAに登録されていず、登録される可能性もありません。XSL仕様はRFC 3028の指導に従っており、MIMEタイプとしてapplication/xslt+xmlを推奨しているからです。あいにく、他の多くのソフトウェアとドキュメンテーションは、仕様をチェックして仕様の意図を確認することをせず、単にMicrosoftの誤りに追従しています(そして、間違いなく、これは誤りです。XSLにしても、そうでないにしても、いかなる種類のXMLドキュメントでも、textが適切なメディア・タイプであることは、まずありません)。 |
|
XMLファイルを識別するための最後の手段は、ファイルを開いて見ることです。この方法は最も速い方法とは言えず、多数のXMLドキュメントの集まりについてはまったく不適切なので、このシリーズで取り上げるべきではないかもしれません。しかし、ときには、これが、ファイルまたはストリームがXMLを含んでいるかどうかを知る唯一の確実な方法です。ファイルまたはストリームをパーサーに放り込んで、うまくいくように願うこともできますが、これはかなり重量級の解決策です。最初の数バイトを見ただけで、ファイルまたはストリームがXMLかもしれないかどうかがわかるので、パーサーでさらにチェックする価値があるかどうかが分かります。たとえば、整形式のXMLドキュメントは、「より小さい」記号(<)で始まることが保証されていて、オプションで空白類が前にあることもあります。実際には、大多数のXMLドキュメントは次の3つのいずれかで始まります。
-
<?xml
-
<!DOCTYPE
-
<foo(fooは任意の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の能力を大幅に高めることができます。
参考文献
著者について
記事の評価
|