XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜

第13回 名前空間を理解しDOMの概要をつかむ

内藤一彦
NRIラーニングネットワーク株式会社
2004/1/30

 今回は、名前空間DOMについて解説します。DOMの詳細については、XMLマスター・プロフェッショナル試験の出題範囲となっていますが、ベーシック試験でも概要的な内容が出題されています。前回、予習問題として下記の問題を出題しておきました。この問題を解くための解説をした後、解答を示します。

今回の問題

(Q1) 下記に示されるXMLインスタンスがあります。NAME要素のnickname属性が属する名前空間はどれでしょう。

<EMPLIST  xmlns="http://www.abc.com/employee">
  <EMPLOYEE  id ="A0149">
    <NAME  xmlns="http://www.abc.com/emp2"
           nickname="Taka" >Taro Yamada</NAME>
    <DEPT>Sales</DEPT>
  </EMPLOYEE>
</EMPLIST>

(a)次の名前空間に属する
http://www.abc.com/employee

(b)次の名前空間に属する
http://www.abc.com/emp2

(c)下記の2つの名前空間に属する
http://www.abc.com/employee
http://www.abc.com/emp2

(d)どの名前空間にも属さない

(Q2) DOMに関する説明として正しいものをすべて選んでください。

 (a)DOMツリーと呼ばれるツリーを構築して各ノードにアクセスする
 (b)
ノードにアクセスするためのAPIが規定されている
 (c)
Javaプログラム言語用のAPIである
 (d)
ツリーの最上位のノードはドキュメントノードである
 

 今回は、この問題に解答するうえで必要となる下記の内容について解説します。

  • 名前空間
    • 必要性とボキャブラリ
    • 宣言と利用
    • デフォルトの名前空間
    • 名前空間の有効範囲
    • 名前空間の上書きと解除
  • 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" ?>
<Order>
  <OrderNO>20040201-01</OrderNO>
  <Customer  Code="A001">
    <Name>ABC corp</Name>
    <Address >東京都千代田区</Address>
    <Tel>03-xxxx-xxxx</Tel>
  </Customer>
  <ProductList>
    <Product Code="AZ001-01">
      <Name>NotePC</Name>
      <Price >200000</Price>
    </Product>
    <Product Code="BE077-01">
      <Name>ColorPrinter</Name>
      <Price >50000</Price>
    </Product>
    <TotalPrice>250000</TotalPrice>
  </ProductList>
</Order>
リスト1 注文書のXML文書(order.xml

 これは文法的には何の問題もないXMLですが、問題が発生する可能性があります。顧客名も製品名もNameという名前が使用されているため、アプリケーションなどからアクセスする際に識別できない可能性があります。

 名前空間を利用すれば、これを完全に識別することができます。

宣言と利用

 名前空間の宣言は、要素の開始タグに記述します。形式は以下のようになります。

<要素  xmlns:修飾子 = "名前空間識別子" >

 名前空間識別子とは、「名前空間の名前」と考えればよいでしょう。名前空間に属する要素や属性は、宣言した修飾子を付けて記述します。

<p:Product p:Code=" AZ001-01">
    <p:Name>NotePC</p:Name>

参考
 修飾子が付いた形式を修飾名(QName)といいます。修飾名は、次のように接頭辞(:の前部)とローカル部(:の後部)から構成されます。

図3 修飾名(QName)の接頭辞とローカル部

 前述の注文書XML(order.xml)を名前空間を使用して記述すると、次のような形になります。

<?xml version="1.0" encoding="Shift_JIS" ?>
<o:Order  xmlns:o="Order"
          xmlns:p="Product"
          xmlns:c="Customer"
>
  <o:OrderNO>20040201-01</o:OrderNO>
  <c:Customer  c:Code="A001">
    <c:Name>ABC corp</c:Name>
    <c:Address >東京都千代田区</c:Address>
    <c:Tel>03-xxxx-xxxx</c:Tel>
  </c:Customer>
  <o:ProductList>
    <p:Product p:Code="AZ001-01">
      <p:Name>NotePC</p:Name>
      <p:Price >200000</p:Price>
    </p:Product>
    <p:Product p:Code="BE077-01">
      <p:Name>ColorPrinter</p:Name>
      <p:Price >50000</p:Price>
    </p:Product>
    <o:TotalPrice>250000</o:TotalPrice>
  </o:ProductList>
</o:Order>
リスト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">
  <OrderNO>20040201-01</OrderNO>

 ただし、デフォルトの名前空間は属性には適用されません。例えば、次のように修飾子が付いていない属性は、どこの名前空間にも所属しないことになります。従って、属性が名前空間に含まれる場合には、デフォルトの名前空間は使うべきではない、ということになります。

    <p:Product  Code="AZ001-01"> ←属性は名前空間に属さない

 リスト3はorder2.xmlのOrderの名前空間をデフォルトの名前空間として記述したものです。

<?xml version="1.0" encoding="Shift_JIS" ?>
<Order  xmlns="Order"
        xmlns:p="Product"
        xmlns:c="Customer">
  <OrderNO>20040201-01</OrderNO>
  <c:Customer  c:Code="A001">
    <c:Name>ABC corp</c:Name>
    <c:Address >東京都千代田区</c:Address>
    <c:Tel>03-xxxx-xxxx</c:Tel>
  </c:Customer>
  <ProductList>
    <p:Product p:Code="AZ001-01">
      <p:Name>NotePC</p:Name>
      <p:Price >200000</p:Price>
    </p:Product>
    <p:Product p:Code="BE077-01">
      <p:Name>ColorPrinter</p:Name>
      <p:Price >50000</p:Price>
    </p:Product>
    <TotalPrice>250000</TotalPrice>
  </ProductList>
</Order>

リスト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>
<SCRIPT language="VBScript">

function dispTree(node)

//DOMツリーを走査します

  for each child in node.childNodes
    document.write(child.nodeName)
  
    if (child.hasChildNodes) then
document.write("<br />")      
dispTree(child)
    else
    document.write(" -- "+ child.text)
     document.write("<br />")
    end If
  next

end function

dim objXmlDocument
set objXmlDocument=createObject("MSXML2.DOMDocument")

//XMLを読み込みます
if objXmlDocument.load("order.xml") then
else
MsgBox "Error"
end if

//ルートエレメントを取得し、情報を表示します
dim objRootElement
set objRootElement = objXmlDocument.documentElement

document.write(objRootElement.nodeName)
document.write("<br />")

//ノード走査を呼び出します
dispTree(objRootElement)

</SCRIPT>
</HTML>
リスト4 VBScriptによるサンプルアプリケーション

図9 IEでの表示結果。「#text--」と表示されている部分は、取得した要素の値


今回の問題の解答

 それでは、予習問題の解答です。

(Q1) 下記に示されるXMLインスタンスがあります。NAME要素のnickname属性が属する名前空間はどれでしょう。

<EMPLIST  xmlns="http://www.abc.com/employee">
  <EMPLOYEE  id ="A0149">
    <NAME  xmlns="http://www.abc.com/emp2"
           nickname="Taka" >Taro Yamada</NAME>
    <DEPT>Sales</DEPT>
  </EMPLOYEE>
</EMPLIST>

 答えは、(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パーサであれば使用可能である
 (b)
XML形式の文書として記述する
 (c)
XML文書から参照する場合、DTDと同様にDOCTYPE宣言を記述する
 (d)
名前空間を使用することができる
 

(Q2) XMLインスタンスで、文字列の値を持つElem要素が0回以上繰り返し出現するとき、このElem要素を定義するXML Schemaを使用する記述として正しいのは次のどれでしょう。

(a)
<xsd:element name="Elem"* type="xsd:string" />

(b)
<xsd:element name="Elem" type="xsd:string"
       Occurs="*" />

(c)
<xsd:element name="Elem" type="xsd:string"
        minOccurs="0" maxOccurs="*"/>

(d)
<xsd:element name="Elem" type="xsd:string"
       minOccurs="0" maxOccurs="unbounded"/>


まとめノート:名前空間を理解しDOMの概要をつかむ

○今回の試験対策のポイント

  • 名前空間
    • 必要性とボキャブラリ
    • 宣言と利用
    • デフォルトの名前空間
    • 名前空間の有効範囲
    • 名前空間の上書きと解除
  • DOM
    • DOMの概要
    • DOMの特徴

○今回の学習内容で出題範囲となる仕様

○今回の学習内容で参考になる@ITの記事

○今回の学習内容で参考になるXML用語集 @IT XML用語事典より)

(14)XML Schemaを利用したスキーマ定義

Index
連載:XMLマスターへの道
  (1)XMLマスター:ベーシック試験のレベルは?
  (2)XMLの概要と起源、関連規格
  (3)XML文書の要素、エンコーディング、宣言
  (4)すべてのXM文書は整形式である
  (5)valid XMLとDTDの関係
  (6)模擬問題:XMLの基本
  (7)模擬問題:W3C XML Schema
  (8)模擬問題:DOM
  (9)DTDの実体宣言と記法宣言
  (10)XSLTの基本構造を理解する
  (11)XSLTで必須の制御命令を覚える
  (12)XPathによるノードの指定法を理解する
(13)名前空間を理解しDOMの概要をつかむ
  (14)XML Schemaを利用したスキーマ定義
  (最終回)XML Schema―型の再利用と名前空間


連載:XMLマスターへの道


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間