XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜
第13回 名前空間を理解しDOMの概要をつかむ
内藤一彦NRIラーニングネットワーク株式会社
2004/1/30
今回は、名前空間とDOMについて解説します。DOMの詳細については、XMLマスター・プロフェッショナル試験の出題範囲となっていますが、ベーシック試験でも概要的な内容が出題されています。前回、予習問題として下記の問題を出題しておきました。この問題を解くための解説をした後、解答を示します。
今回の問題 | ||||||||
(Q1) 下記に示されるXMLインスタンスがあります。NAME要素のnickname属性が属する名前空間はどれでしょう。
|
||||||||
(Q2) DOMに関する説明として正しいものをすべて選んでください。 (a)DOMツリーと呼ばれるツリーを構築して各ノードにアクセスする |
今回は、この問題に解答するうえで必要となる下記の内容について解説します。
- 名前空間
- 必要性とボキャブラリ
- 宣言と利用
- デフォルトの名前空間
- 名前空間の有効範囲
- 名前空間の上書きと解除
- DOM
- DOMの概要
- DOMの特徴
■名前空間
必要性とボキャブラリ
名前空間とは、簡単にいうと「XML文書の中で要素や属性が所属するグループ」です。W3Cで「Namespaces in XML」として勧告されています。
おそらく、企業内にはさまざまなシステムやアプリケーションが存在しているでしょう。ある情報を識別するための名前として、それぞれで異なる名前を付けていないでしょうか。
例えば、販売している商品を、あるシステムでは「Item」、また別のシステムでは「Product」、さらに別のシステムでは「製品」という名前で呼んでいるかもしれません。どれも本当は同じ「モノ」を指しているにもかかわらず、システムによって異なる呼び名を使っていたのでは、混乱が生じますし、システム間でデータ連携をする場合、必ず変換が必要となり、システム全体が複雑になってしまいます。
これを防ぐためには、まず企業内で語彙(ごい)の統一をしておくことが必要です。前述の例であれば、どのシステムでも「Product」という名前で識別するということです。
また、同時にその「モノ」はどんな情報項目を持っているかも決めておきます。これを「ボキャブラリ」といいます。Product(製品)とCustomer(顧客)のボキャブラリの例を挙げておきます。
図1 ボキャブラリの例 |
今度は「注文書」というものを考えてみましょう。注文書には、顧客の名前や注文品が含まれているので、ProductとCustomerのボキャブラリを使用して、注文書を構成することができます。
図2 ボキャブラリを使った注文書の例 |
この注文書をXMLで表現してみましょう。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト1 注文書のXML文書(order.xml) |
これは文法的には何の問題もないXMLですが、問題が発生する可能性があります。顧客名も製品名もNameという名前が使用されているため、アプリケーションなどからアクセスする際に識別できない可能性があります。
名前空間を利用すれば、これを完全に識別することができます。
名前空間の宣言は、要素の開始タグに記述します。形式は以下のようになります。
<要素 xmlns:修飾子 = "名前空間識別子" > |
名前空間識別子とは、「名前空間の名前」と考えればよいでしょう。名前空間に属する要素や属性は、宣言した修飾子を付けて記述します。
<p:Product p:Code=" AZ001-01"> |
参考
修飾子が付いた形式を修飾名(QName)といいます。修飾名は、次のように接頭辞(:の前部)とローカル部(:の後部)から構成されます。
図3 修飾名(QName)の接頭辞とローカル部 |
前述の注文書XML(order.xml)を名前空間を使用して記述すると、次のような形になります。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト2 注文書XMLに名前空間を追加(order2.xml) |
「o:」が記述されている要素や属性は「Orderの名前空間」、「p:」が記述されているのが「Productの名前空間」、「c:」が記述されているのが「Customerの名前空間」にそれぞれ所属していることになります。顧客名や製品名で使っているName要素は名前空間によって完全に識別されているので、アプリケーションなどからアクセスする場合、名前空間を指定して要素や属性にアクセスするので問題は起こりません。
簡易ツールを使って、名前空間を確認してみます。このツールは、インフォテリア認定教育センターの一部のXMLコースで利用されています。一般の方でもダウンロードして利用できます(スキーマ検証ツール(1))。
ツール本体のValidateXML1.0.jarを起動し、確認したいXMLファイルを指定します。その際、「名前空間と文字データを確認する」のオプションをチェックします。
図4 XML検証ツールの起動画面(クリックで拡大します) |
「検証実行」ボタンを押すと、結果が表示されます。XMLドキュメント内の要素は「名前空間識別子#要素名」、属性は「名前空間識別子#属性名」という形式で表示されます。
図5 表示内容の一部を抜粋 |
デフォルトの名前空間とは、修飾子を付けない名前空間を指します。次の形式で宣言されます。
<要素 xmlns = "名前空間識別子" > |
このデフォルトの名前空間に属する要素は、修飾子を付けずに記述します。
<Order xmlns="Order"> |
ただし、デフォルトの名前空間は属性には適用されません。例えば、次のように修飾子が付いていない属性は、どこの名前空間にも所属しないことになります。従って、属性が名前空間に含まれる場合には、デフォルトの名前空間は使うべきではない、ということになります。
<p:Product Code="AZ001-01"> ←属性は名前空間に属さない |
リスト3はorder2.xmlのOrderの名前空間をデフォルトの名前空間として記述したものです。
<?xml version="1.0" encoding="Shift_JIS" ?> |
リスト3 注文書XML文書でデフォルトの名前空間を使用。赤字がOrder名前空間に属している(order3.xml) |
名前空間の有効範囲
名前空間には有効範囲があり、どこの要素で宣言を行っているかに従います。XMLの階層構造を考え、宣言を行っている要素を含めてその子孫が有効範囲となります。ルート要素で宣言しておけば、XML文書全体で有効となります。
図6 名前空間の有効範囲(order4.xml) |
名前空間の上書きと解除
同じ修飾子に対して名前空間を再定義すると、それは上書きとなります。その際に、名前空間識別子に値を入れず再定義すると、名前空間は解除されます。
図7 名前空間の再定義内容が及ぶ有効範囲(order5.xml) |
この例では、ルート要素のOrder要素で名前空間の修飾子「o」にOrderという名前空間を定義していますが、ProductList要素ではこの「o」にPOという名前空間を再定義しています。従って、ProductListやTotalPriceはOrderではなくPOの名前空間の所属となります。。
■DOM
DOMの概要
DOM(Document Object Model)は、XMLやHTML文書をプログラムから操作するためのAPI(アプリケーション・インターフェイス)であり、W3Cで標準仕様として勧告されています。仕様の付録として、Javaでの実装例とECMAScript(JavaScriptなどのスクリプト言語)での実装例が挙げられていますが、もちろんそのほかのさまざまな言語からも利用できます。DOMを利用すれば、XML内の要素や属性などのノードを参照したり、変更できます。
現在、勧告されているDOMの仕様には、次のものがあります。level2では、機能が強化され、機能ごとに仕様が分離されています。現在、次のバージョンであるlevel3が策定中です。最新の情報については、W3CのWebサイトで確認してください。
DOM仕様名 | 内容 |
DOM level1 Core | XMLやHTML文書を操作するためのAPI基本仕様 |
DOM level2 Core | leve1の追加仕様(基本機能) |
DOM level2 Views | XMLの表示 |
DOM level2 Style | スタイル定義 |
DOM level2 Events | イベント定義 |
DOM level2 Traversal and Range | XMLへのアクセスと範囲指定 |
DOM level2 HTML | HTML操作 |
表1 W3Cから勧告されているDOM仕様 |
DOMの特徴
DOMを利用したXML文書の処理では、XML文書が読み込まれるとメモリ上に展開され、要素や属性などを節(ノード)としたDOMツリーというオブジェクトツリーが構築されます。そのDOMツリー上のノードにアプリケーションからアクセスを行います。
図8 DOMツリーはXMLドキュメントから生成され、アプリケーションからDOM APIによってアクセスされる |
このようにDOMでは、読み込んだXMLを基にメモリ上にツリーを構築するので、一般的にメモリの消費が大きくなります。
参考までにDOMを利用したサンプルアプリケーションを紹介します。VBScriptを利用して、XML内の要素とその値を取得しています。
<HTML> |
リスト4 VBScriptによるサンプルアプリケーション |
図9 IEでの表示結果。「#text--」と表示されている部分は、取得した要素の値 |
■今回の問題の解答
それでは、予習問題の解答です。
(Q1) 下記に示されるXMLインスタンスがあります。NAME要素のnickname属性が属する名前空間はどれでしょう。
<EMPLIST xmlns="http://www.abc.com/employee"> |
答えは、(d) どの名前空間にも属さない、です。
このXMLではデフォルトの名前空間が使用されています。しかし、属性にはデフォルトの名前空間は適用されませんので、属性に修飾子が付いていなければ、「名前空間に所属しない」ということになります。
このXMLに含まれる要素や属性の名前空間の所属は次のようになります。
要素/属性 | 所属する名前空間 |
EMPLIST要素 | http://www.abc.com/employee |
EMPLOYEE要素 | http://www.abc.com/employee |
id属性 | 所属なし |
NAME要素 | http://www.abc.com/emp2 |
nickname属性 | 所属なし |
DEPT要素 | http://www.abc.com/employee |
この問題に関して参考になる解説は、「名前空間(デフォルトの名前空間)」です。
(Q2) DOMに関する説明として正しいものをすべて選んでください。
(a)DOMツリーと呼ばれるツリーを構築して各ノードにアクセスする(b)ノードにアクセスするためのAPIが規定されている
(c)Javaプログラム言語用のAPIである
(d)ツリーの最上位のノードはドキュメントノードである
答えは(a)、(b)、(d)です。
(c)については、特に言語は特定されていません。また、(d)はDOMツリーの構成に関するトピックです。DOMツリーはXPathのツリーとよく似た構造をとります(第12回 XPathによるノードの指定法を理解する XPathのデータモデル参照)。XPathのルートノードは、DOMツリーではドキュメントノードに対応します。その子として、ルート要素が要素ノードとして存在します。
図10 DOMツリーの最上位はドキュメントノード(XPathとの違いに注意しよう) |
■次回の予習問題
次回のための予習問題を掲載します。
次回から2回にわたって、XML Schemaを利用したXML文書構造の定義方法について紹介します。XML Schemaは機能も豊富で高度なスキルが要求されますが、XMLマスター・ベーシックでは、その基礎や基本的な定義方法が要求されます。
予習問題 | ||||||||
(Q1) XML Schemaの特徴として正しい説明はどれでしょう。正しいものをすべて選んでください。 (a)XML1.0対応のXMLパーサであれば使用可能である |
||||||||
(Q2) XMLインスタンスで、文字列の値を持つElem要素が0回以上繰り返し出現するとき、このElem要素を定義するXML Schemaを使用する記述として正しいのは次のどれでしょう。
|
■まとめノート:名前空間を理解しDOMの概要をつかむ
○今回の試験対策のポイント
- 名前空間
- 必要性とボキャブラリ
- 宣言と利用
- デフォルトの名前空間
- 名前空間の有効範囲
- 名前空間の上書きと解除
- DOM
- DOMの概要
- DOMの特徴
○今回の学習内容で出題範囲となる仕様
- XML
- Namespaces in XML(XML名前空間)
- DOM
○今回の学習内容で参考になる@ITの記事
- XMLマスターへの道 第2回 XMLの概要と起源、関連規格
- 技術者のためのXML再入門 第6回 XML名前空間でタグを使い分ける
- XML深層探求 XML名前空間の落とし穴
- 技術者のためのXML再入門 最終回 XMLデータを操作する〜DOMの詳細
- XMLマスターへの道 第8回 XMLマスター模擬試験:DOM
- XMLテクニック集
○今回の学習内容で参考になるXML用語集 (@IT XML用語事典より)
(14)XML Schemaを利用したスキーマ定義 |
連載:XMLマスターへの道 |
- QAフレームワーク:仕様ガイドラインが勧告に昇格 (2005/10/21)
データベースの急速なXML対応に後押しされてか、9月に入って「XQuery」や「XPath」に関係したドラフトが一気に11本も更新された - XML勧告を記述するXMLspecとは何か (2005/10/12)
「XML 1.0勧告」はXMLspec DTDで記述され、XSLTによって生成されている。これはXMLが本当に役立っている具体的な証である - 文字符号化方式にまつわるジレンマ (2005/9/13)
文字符号化方式(UTF-8、シフトJISなど)を自動検出するには、ニワトリと卵の関係にあるジレンマを解消する仕組みが必要となる - XMLキー管理仕様(XKMS 2.0)が勧告に昇格 (2005/8/16)
セキュリティ関連のXML仕様に進展あり。また、日本発の新しいXMLソフトウェアアーキテクチャ「xfy technology」の詳細も紹介する
|
|