Firefox 1.5でのXML、第2回:基本的なXML処理

FirefoxでXMLを活用しよう。でも、基本的な制約に注意!

「Firefox 1.5でのXML」シリーズの第2回では、基本的なXML処理について述べます。Firefoxは、XML解析、カスケーディング・スタイルシート(CSS)、およびXSLTスタイルシートをサポートしています。注意すべき制約事項もいくつかあります。このシリーズの第1回「Firefox 1.5でのXML、第1回:XML機能の概要」では、Uche OgbujiはFirefoxのさまざまなXML関連機能を簡単に紹介しました。

Uche Ogbuji, Principal Consultant, Fourthought, Inc.

Photo of Uche OgbujiUche Ogbuji は、次世代の Web 技術を専門とするサービスの会社である、Uli, LLC の代表者です。Ogbuji 氏は XML、RDF、およびナレッジ管理アプリケーション用のオープン・ソース・プラットフォームである 4Suite の開発リーダーであり、Versa RDF 照会言語の開発リーダーでもあります。ナイジェリア出身のコンピューター・エンジニア兼ライターで、米国コロラド州ボールダー在住です。彼に関して詳しくは、彼のブログである Copia を見てください。



2006年 3月 21日

私の記事「Firefox 1.5でのXML、第1回:XML機能の概要」が2005年9月(2006年3月更新)に最初に公開されてから、Firefoxの世界では、いくつか重要なできごとがありました。その中でも重要なのは、Firefox 1.5のリリースと、そのマイナー・バグフィックス版であり、現在の最新バージョンであるFirefox 1.5.0.1のリリースです。Firefox 1.5.0.2もまもなくリリースされる予定です(4月初旬予定)。この記事では、FirefoxでのXML処理の基本について詳しくお話します。Firefoxのスクリーンショットも含まれています。これらはすべて、Ubuntu Linux上でフレッシュ・プロファイルのFirefox 1.5.0.1を使用して作成されたものです(すなわち、拡張機能を含まず、インストール時のデフォルト・オプションのままです)。

解析のイロハ

FirefoxとXMLでできる最も基本的なことは、未知のボキャブラリーを持ち、スタイルシートが関連付けられていないXMLファイルをロードすることです。リスト1は、このようなファイルです。

リスト1(listing1. xml)シンプルなXMLファイルの例
<memo>
<date form="iso-8601">2002-08-14</date>
This is just to <strong>say</strong>:
I ate the eggs you left in the fridge
And were probably saving for breakfast.
Do you know?  They were <emph>quite</emph> rotten.
</memo>

このファイルをFirefoxで表示すると、図1のような表示になります。

図1.Firefoxでのリスト1の表示
Firefoxでのリスト1の表示

ブラウザー領域の上部のメッセージに注意してください。特に、「The document tree is shown below」(ドキュメント・ツリーを下記に示します)の部分に注目してください。これは、これをXMLのソース・ビューとみなすべきではないことを強調しています。Firefoxにとって重要なのは、ドキュメントの各部分の論理的レイアウトに過ぎません。ユーザーにとっては重要かもしれないが、Firefoxにとって重要でない詳細は省かれ、ドキュメントが歪められています。歪みの例として、ソース・ドキュメントではそうなっていない場合でも、Firefoxでは要素ごとに改行されていることに注目してください。この例のように混合内容を使用しているドキュメントの場合、これは内容の大幅な再配置です。Firefoxによる詳細の省略の例として、リスト2をブラウザーに表示してみてください。

リスト2(listing2. xml)名前空間などを含むシンプルなXMLファイルの例
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE memo>
<memo xmlns='http://example.com'>
<date form="iso-8601">2002-08-14</date>
This is just to <strong>say</strong>:
I ate the eggs you left in the fridge
And were probably saving for breakfast.
Do you know?  They were <emph>quite</emph> rotten.
</memo>

リスト2の表示はリスト1の表示とまったく同じであり、XML宣言、文書型宣言、および名前空間宣言のすべてが表示から省かれています。元のXMLをそのまま見たい場合は、ソース表示機能を使用してください。メニュー・バーから、「View」を選択し、「Page Source」を選択します。通常のショートカットはCtrl+Uです。ブラウザーのメイン・ペインからコンテキスト・メニュー(右クリック)を使用することもできます。ソース表示を図2に示します。これはソース・リストと完全に一致しています。

図2.Firefoxでのリスト2のソース表示
Firefoxでのリスト2のソース表示

図1の表示に戻って、memo要素の開始タグの前のマイナス記号に注目してください。各コンテナ要素にこのようなマーカーが付き、これをクリックすることで、その要素の展開と折り畳みができます。これはデバッグの際、XMLファイルの中のその時点で作業に関係ない部分をしまい込みたい場合に便利です。

解析エラー

Firefoxによる不整形式(ill-formed)ドキュメントの扱いを示すために、リスト2のdate要素の直前に偽の文字実体&#1;(一部の文字は、実体として表現される場合でも、XMLでは不正です)を追加して、Firefoxで表示しました。図3にFirefoxの出力を示します。エラーとエラーが検出された位置が報告されています。

図3.不整形式XMLのFirefoxでの表示
不整形式XMLのFirefoxでの表示

エラーの特定に必要なソース・ファイルしか表示されないことに注目してください。やはりソース表示機能を使用すると、いつでもソース・ドキュメント全体を見ることができます。


XMLのタイプ

XMLは、その上にさらに具体的なフォーマットを構築するための基本フォーマットに過ぎず、Firefoxは、それがたまたまサポートしている主要なXMLフォーマットについて、特殊な処理とレンダリングを使用します。XHTML、SVG(Scalable Vector Graphics)、XSLTなど、これらのいくつかについては、前の記事で触れました。ブラウズされるリソースがXMLかどうか、また、特殊形式のXMLかどうかについてFirefoxが判断するための主な手段は、インターネット・メディア・タイプです(一般にMIMEタイプと呼ばれています)。Webサーバーは、ブラウザーに配信されるリソースごとに、MIMEタイプを送信します。ファイルがローカル・ファイル・システムから開かれる場合、ブラウザーはファイルの拡張子に基づいてMIMEタイプを推測します。表1に、クリーンなFirefoxインストールによって認識されるXML関連のMIMEタイプを示します。

表1.Firefoxが扱うXML MIMEタイプ
MIMEタイプFirefoxによる処理
text/xml使用可能な場合はCSSを適用し、そうでない場合はデフォルトのXMLハンドラー可能な場合、このメディア・タイプは避けてください。
application/xml
使用可能な場合はCSSを適用し、そうでない場合はデフォルトのXMLハンドラー
 
application/*+xml使用可能な場合はCSSを適用し、そうでない場合はデフォルトのXMLハンドラーXMLの規則を使用している任意のメディア・タイプに適用されます。
application/xhtml+xml文書型宣言に従って、XHTMLとしてレンダリングします。これには、XHTML内に埋め込まれたときにFirefoxが認識するボキャブラリー(MathML、XLink、SVGなど)が含まれます。
application/vnd.mozilla.xul+xmlMozilla chromeハンドラー(カスタムMozilla UI用) 
application/rdf+xmlデフォルトのRDFレンダラー(すべてのテキスト・リテラル・オブジェクトを表示します)Firefoxは構成レジストリーでRDFを使用します。
image/svg+xmlSVGレンダラー 

一部のFirefox拡張を使用すると、Firefoxはさらにいくつかのメディア・タイプを認識することができます。また、特定のXMLフォーマット用のアプリケーション・ハンドラーを追加することもできます。たとえば、ボイス・ブラウザーでVoiceXMLを扱いたい場合は、そのアプリケーションをapplication/voicexml+xmlというMIMEタイプで登録します。

Firefoxがページに関連付けるMIMEタイプは、そのページがロードされた後で確認できます。ページを右クリックして、コンテキスト・メニューから「View page info」を選択します。Firefoxは、拡張子が.xmlのファイルにはtext/xmlを使用しますが、現在のベスト・プラクティスに従えば、application/xmlを使用すべきです。


一連の残念な制約

Firefoxは、ユーザーが使用するかもしれないXML機能のいくつかをサポートしていません。Firefoxを念頭においてページをデザインするときには、基本的なXML処理における制約を知っておくとよいでしょう。これらの制約の多くは、バグ・レポートと機能強化リクエスト(「bugzilla」)として公開されています。「参考文献」に、これらの多くへのリンクがあります。Mozilla開発者たちが高い優先度を与えるべきバグまたは機能強化リクエストに投票することができます。これらの制約があなたに影響を与える場合は、Mozillaバグ・トラッカー・アカウントを取得して(手続きは非常に簡単です)、投票してください。

最初に述べるべき制約は、FirefoxがXMLファイルを解析するときには、解析が完了するまで、処理スレッドがハングアップすることが多いということです。これは、非常に大きなXMLファイルをFirefoxに送った場合、ユーザーは何かが表示されるまで長い間待たなければならないことを意味します。大きなHTMLファイルをFirefoxに送った場合、Firefoxは段階的レンダリングを使用してHTMLを1ビットずつ読み取って表示します。XMLについても同様の機能があるとよいのですが、とりあえずは、ブラウザーに送るXMLファイルのサイズを考慮するしかありません。

Firefoxは、DTD検証をサポートしていません。外部ファイルのDTDを読み取らず、ドキュメント内の宣言(内部サブセットと呼ばれます)を使用した検証も行いません。外部ファイルの読み取りに関する限り、パラメーター実体(DTDやDTD断片など)であれ、汎用実体(外部の整形式XML断片)であれ、Firefoxはいかなる外部実体も読み取りません。これは、extFile.entの内容に関係なく、Firefoxはリスト3リスト4と同じように論理的に処理することを意味します。

リスト3.外部解析対象実体を使用するXMLファイル
    <!DOCTYPE myXML[
    <!ENTITY extFile SYSTEM "extFile.ent">
    ]>
    <myXML>&extFile;</myXML>
リスト4.リスト3と同じようにFirefoxによって論理的に処理される、実体のないXML
    <myXML></myXML>

このような外部実体のサポートは、セキュリティーとパフォーマンスに影響しますが、どちらも対処法はあり、Firefoxが、すぐにでもこれらの制約に対処することを期待しています。

RDF/XMLを使用する場合、FirefoxはRDFを解析するときに整形式のチェックを行わないことに注意してください。結果として、Firefoxは、整形式であるかどうかに関係なくRSS 1.0 Webフィード(RDF)を処理します。Webコミュニティーが整形式のWebフィードの実施を強化しようとしている中で、これは残念なことです。


スタイルの要素

Firefoxで任意のXMLを非汎用方式でレンダリングするための最も簡単な方法は、スタイルシートを使用することです。Firefoxは、カスケーディング・スタイルシートとXSLTをサポートしています。これらのテクノロジーのFirefoxでの使用については、IBM developerWorksにこのトピックに関する詳細なチュートリアルがすでにあるので、ここでは詳しく述べません。詳しくは、「参考文献」を参照してください。ここで言っておかなければならないことは、スタイルシートがソースXMLドキュメントと同じインターネット・ドメインからロードされるようにする必要があるということです。さもなければ、Firefoxはスタイルシートをロードせず、適用しません。このセキュリティー上の制限は、XSS(クロスサイト・スクリプティング攻撃)を避けるためです。

Firefox専用のXSLT

XSLTのように確立された標準でも、エンジンによって動作に差が出ることがあります。MozillaおよびFirefox、または何らかの形式のTransformiix(MozillaにバンドルされているXSLTエンジン)でのみ実行するXSLTのセクションを指定する必要がある場合は、リスト5のような条件付きブロックを使用してください。

リスト5.Mozilla専用のXSLTコード・ブロックの例
<xsl:if test="system-property('xsl:vendor')='Transformiix'">
  <xsl:text>This will only be output by 

Firefox/Mozilla/Transformiix</xsl:text>
</xsl:if>

XSLTエンジンごとにシステム・プロパティーの値が異なるので、必要な場合は、それぞれの専用セクションを用意する代わりに、xsl:chooseを使用することもできます。


まとめ

実体のいろいろ

XMLには、さまざまな種類の実体があり、そのため、「実体」(entity)という用語をめぐって、少なからぬ混乱があります。あいにく、この混乱の中には、Firefoxのドキュメンテーションやディスカッションに影響を与えているものもあります。Mozilla FAQやbugzillaの記事にも、このような混乱が見られます。このような混乱のいくつかについては、私のブログ記事「Internal entities in browsers」で報告しました。

重要ないくつかの種類の実体と、MozillaおよびFirefoxでのそれらのサポートについて、私の非公式な要約を以下に示します。

  • 文字実体:フルサポート。
  • 内部汎用実体(リテラルとして宣言された整形式のXML断片):内部DTDサブセットで定義した場合はフルサポート。
  • 外部解析対象汎用実体(外部リソースへの参照として宣言):サポートされません(無視されます)。
  • パラメーター実体(DTD断片):サポートされません(無視されます)。
  • 解析対象外実体:サポートされません(無視されます)。

ご覧のように、Firefoxには多くの機能があります。単純化した論理ビュー、または元のソース形式でXMLを表示することができます。整形式エラーを確認できます。CSSやXSLTを使用して、表示をカスタマイズできます。Firefoxは、MIMEタイプに基づいて、いくつかの重要なXMLボキャブラリーを認識し、それに応じて処理します。FirefoxでXMLを処理するときには、いくつかの制約があります。主要ブラウザーはすべて、何らかの仕組みによってXMLをサポートしているので、その機能と制約を理解しておくことが重要です。Webフィード、SVG、XSLTなどのXMLベースのテクノロジーが重要性を増すにつれて、ブラウザーのXMLサポートは強化されていくでしょう。それまでの間は、FirefoxでXMLを十分に活用することができます。さらに詳しくは、IBM developerWorksのこのシリーズの今後の記事をお楽しみに。

まとめとして、内部汎用実体についてはDTDの内部サブセットがチェックされて、正しく処理されます。その他のタイプの非文字実体については、内部サブセットで宣言されている場合でも、すべて無視され、検証は行われません。

参考文献

学ぶために

  • このシリーズの第1回、「Firefox 1.5でのXML、第1回:XML機能の概要」(developerWorks, 2005年9月)は、Firefoxの様々なXML関連機能を解説しています。
  • Uche Ogbuji著による、最も重要なXML標準に関する詳細なクロス・リファレンス、A survey of XML standards: Part 4 (developerWorks, 2004年3月)は、この記事で触れたXML技術の多くを解説しています。
  • CSS と、XMLにおけるCSSの基本を、developerWorksのチュートリアル・シリーズ、「Display XML with Cascading Stylesheets」で学んでください。
  • Mozillaのバグや機能リクエストの幾つかのはXMLに関係しています。これらは、このソフトウェアで作業する上での制限を示すものと言えます。
  • developerWorksのXMLゾーンには、様々な記事やチュートリアル、ヒント、標準など、XMLに関するリソースが豊富に用意されています。
  • XMLおよび関連技術においてIBM認証開発者になる方法については こちら を参照してください。この試験の準備には、無料のdeveloperWorksチュートリアルやIBM XML certification successなどが役立つでしょう。

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

  • MozillaベースのWebブラウザー、Firefoxを入手してください。標準に準拠したブラウザーとして、優れたパフォーマンスやセキュリティー、堅固なXML機能などを実現しています。

コメント

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
ArticleID=239853
ArticleTitle=Firefox 1.5でのXML、第2回:基本的なXML処理
publish-date=03212006