• 検索結果がありません。

XMLプログラミング(DOM編)

N/A
N/A
Protected

Academic year: 2021

シェア "XMLプログラミング(DOM編)"

Copied!
12
0
0

読み込み中.... (全文を見る)

全文

(1)

■ DOM に依る XML 文書の操作 ■ ■ DOM と DOMDocument オブジェクト

プログラミング言語からXML を扱うには、DOM(Document Object Model)と呼ばれるプログラミン グインターフェイスを利用するのが最も簡単で有る。DOM は Internet Explorer 5.x 以降の XML パー サ(MSXML)に実装されて居る。 DOMDocument オブジェクト プログラミング言語からDOM を利用するには、DOMDocument オブジェクトのインスタンスを生成 し、其のプロパティとメソッドを操作する。DOMDocument は XML 文書に記述されたデータとデータ 構造を保持するオブジェクトで、Java、JavaScript、VBScript、C#、C++等のプログラミング言語か らXML 文書に記述されたデータを取り出して、利用出来る様に成る。 DOM は、W3C で規定されたオブジェクトの操作手段で有り、公開された API を利用する事で、各種 プログラミング言語からXML 文書を操作出来る。併し、実用的で小回りの利くアプリケーションを作

るには、機能不足と思える面も有る。其の為、Internet Explorer では W3C の規定に独自の拡張 API を加えて居る。 インスタンスの生成 アプリケーションからDOMDocument を扱うには、先ず、オブジェクトのインスタンスを生成し、其 処に既存のXML 文書を読み込ませたり、或いは、XML 形式に変換したデータをオブジェクトを介して 書き出したりする事に成る。 下記の様に仕てDOMDocument オブジェクトのインスタンスを生成する。

Dim Doc As MSXML2.DOMDocument Set Doc = New MSXML2.DOMDocument()

併し、HTML 文書中で JavaScript 等の言語を使って XML 文書を扱うなら、更に簡単な方法が有る。 XML データアイランド(XML Data Island)と呼ばれる機能を利用する方法で有る。 データアイランドの生成 HTML 文書中で<xml>タグに依り XML 文書を定義すると、XML データアイランドが生成される。書 式は下記の様に成る。 <xml id=識別名> …XML 文書… </xml> 上記id には、文字列型の識別名を与える。此れが XML ID と成り、データアイランドは DOMDocument

X

XM

ML

L

プロ

ログ

グラ

ラミ

ミン

ング

(2)

オブジェクトと仕て操作する事が出来る(実際には、タグに囲まれた範囲のXML 文書に対してデータ が解析された後、DOMDocument オブジェクトが生成される)。 例えば、下記の様な形で有る。 <xml id="XMLMembers"> <社員> <番号>1001</番号> <氏名>山中 重義</氏名> <所属>総務部</所属> <役職>部長</役職> </社員> </xml> XML データアイランドの生成 XML 文書を別ファイルと仕た場合、src オプションに依りファイルのパスを指定する事も出来る。 <xml id=識別名 src=パス></xml> XML 文書は、通常 HTML ファイルとは別のファイルと成って居るから、既存の XML 文書を読み込ん で処理する場合、此方の形式の方が一般的で有る。下記の様な感じに成る。 <xml id="XMLMembers" src="members.xml"></xml> 其の他、先に空のデータアイランドを定義して置いて、スクリプトでDOMDocument の load メソッド を使い、外部のXML 文書を読み込ませる事も出来る。 <xml id="XMLMembers"></xml> : xml.load("members.xml"); 亦、<script>タグでデータアイランドを定義する事も可能で有る。 <script language="xml" id="XMLItems">

<社員> <番号>1001</番号> <氏名>山中 重義</氏名> <所属>総務部</所属> <役職>部長</役職> </社員> </script> DOMDocument オブジェクトのプロパティとメソッド 此の様に、HTML 文書でスクリプトを使えば、XML データアイランドを介して XML 文書を簡単に扱 える様に成る。

(3)

下記に、DOMDocument オブジェクトの主なプロパティとメソッドを掲げて置く。DOMDocument で は、XML 文書内のデータはルート要素から始まる階層構造と仕て参照する事が出来る。 DOMDocument オブジェクトの主なプロパティ documentElement XML 文書のルート要素 async 非同期読み込み(規定値はTrue) ★ item 直下の要素の集合(0から始まるインデックスに依り要素を指定する) text 要素の保持するテキストデータ ★ namespaceURI 名前空間のURI ★ definition DTD 又はスキーマに依るノードの定義 ★ nodeName ノード名 nodeType ノードの型を示すコード(要素=1、属性=2、テキスト=3) nodeTypeString ノードの型名 ★ attributes ノードの属性 dataType ノードのデータ型 ★ nodeValue ノードの値 parentNode 存在すれば親のノード、無ければnull childNodes 子ノードの集合 firstChild 最初の子ノード lastChild 最後の子ノード previousSibling 現在のノードの直前のノード nextattrbutesSibling 現在のノードの直後のノード parsed 構造が解析済みか何うか ★ parseError 構造解析時のエラー情報(IXMLDOMParseError オブジェクト) ★ ★マークは独自に拡張された物 DOMDocument オブジェクトの主なメソッド abort* 非同期のダウンロードを中止 ★ appendChild ノードの最後に新しい子ノードを追加 createAttribute 新しい属性を作成 createComment コメントノードを作成 createElement 要素ノードを作成 createNode* 型と名前空間を指定してノードを作成 ★ createTextNode テキストノードを作成 getElementsByTagName 指定された名前を持つ要素の集合を戻す load ファイル指定してXML 文書をオブジェクトに読み込む ★ loadXML 文字列を指定してXML 文書をオブジェクトに読み込む ★ removeChild 子ノードを削除 replaceChild 子ノードを置換 save 保持しているXML 文書を書き出す ★ selectNodes 指定したパターンに適合するノードのリストを返す ★ transformNode* 指定したスタイルシートを使ってXML 文書を表示形式のテキスト に変換 ★ transformNodeToObject 指定したスタイルシートを使ってXML 文書を表示形式オブジェク トに変換 ★ ★マークは独自に拡張された物

(4)

■ 各種言語と DOMDocument

XML データアイランドを用いる他、既に紹介した様に、アプリケーションの側で XMLDOMDocument

オブジェクトを生成してXML 文書にアクセスする事も可能で有る。

Microsoft XML Parser(MSXML)の入手

Microsoft XML Parser(MSXML~msxml.dll)は、Internet Explorer 5.x 以上にコンポーネントと仕 て組み込まれて居る。亦、下記のサイトにアクセスすれば、最新のMSXML 4.0 とサービスパック 1(SP1) がダウンロード出来る。

http://msdn.microsoft.com/library/en-us/dnmsxml/html/whatsnew40rtm.asp?frame=true スクリプト

VBScript と JavaScript では、下記の様に仕て XMLDOMDocument オブジェクトを生成出来る。 ・VBScript

Set xmlDoc = CreateObject("Microsoft.XMLDOM") ・JavaScript

var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");

孰れの場合も、XML 文書を読み込ませる場合は下記の様なコードを記述する。strXMLDocument は XML 文書の URL を示す文字列とする。 xmlDoc.async = false xmlDoc.load strXMLDocument ASP の VBScript ASP の場合は、Web サーバー側にパーサーが必要で有る。 Set xmlDoc = Server.CreateObject("Microsoft.XMLDOM")

XML 文書を読み込ませるには、下記の様なコードを記述する。strXMLDocument は、XML 文書の URL を示す文字列とする。 xmlDoc.async = false xmlDoc.load strXMLDocument Visual Basic、Visual C# 『プロジェクト』→『参照設定』で、プロジェクトにMicrosoft XML, x.x(x.x はバージョン)ライブ ラリを追加する。

Visual Studio .NET では『プロジェクト』→『参照の追加』で『COM』タブから Microsoft XML, x.x を追加する。

(5)

Dim xmlDoc As MSXML.DOMDocument Set xmlDoc = New MSXML.DOMDocument

XML 文書を読み込ませるには、下記の様なコードを記述する。strXMLDocument は、XML 文書の URL を示す文字列とする。 xmlDoc.async = false xmlDoc.load strXMLDocument C++と DOM Visual C++では msxml.dll をインポートし、オブジェクトのインスタンスを生成する必要が有る。 #import "msxml.dll" using namespace MSXML; : MSXML::IXMLDOMDocumentPtr pDOMDoc(__uuidof(MSXML::DOMDocument)); C++で XML 文書を読み込ませるには、下記の様にする。 pDOMDoc->put_async(VARIANT_FALSE);

VARIANT_BOOL varResult = DOMDoc->load(_variant_t(bstrURLofXMLDoc)); ■ サンプル~スタイルシートの切り替え JavaScript で XML データアイランドを使ったサンプルと仕て、スタイルシートの切り替え処理を紹介 する。 スタイルシートで表示を切り替える XML で記述されたデータベースのテーブルは、XSL スタイルシートに依り表示形式を設定する事が出 来る。詰まり、スタイルシートを複数用意すれば、1つのテーブルの内容を様々な表示形式で提示する 事が出来ると謂う事で有る。 リスト1 は、社員情報の XML 文書で有る。亦、此の XML 文書を表示する為のスタイルシートを、リ スト2~4 の3通り用意した。各スタイルシートの表示形態は、下記の様に成って居る。 members-a.xsl(リスト 2):単純にデータを表示するだけ members-b.xsl(リスト 3):社員番号を太字で表示する members-c.xsl(リスト 4):データを枠線付きの表形式で表示する リスト1 <?xml version="1.0" encoding="Shift_JIS" ?> <!DOCTYPE 社員情報 [ <!ELEMENT 社員情報 (社員)+> <!ELEMENT 社員 (番号,氏名,所属,役職)>

(6)

<!ELEMENT 番号 (#PCDATA)> <!ELEMENT 氏名 (#PCDATA)> <!ELEMENT 所属 (#PCDATA)> <!ELEMENT 役職 (#PCDATA)> ]> <社員情報> <社員> <番号>1001</番号> <氏名>山中 重義</氏名> <所属>総務部</所属> <役職>部長</役職> </社員> <社員> <番号>1002</番号> <氏名>会田 美子</氏名> <所属>総務部</所属> <役職>主任</役職> </社員> <社員> <番号>2001</番号> <氏名>奥村 義男</氏名> <所属>営業部</所属> <役職>部長</役職> </社員> <社員> <番号>2011</番号> <氏名>西岡 恒彦</氏名> <所属>広報課</所属> <役職>課長</役職> </社員> <社員> <番号>2013</番号> <氏名>園田 充子</氏名> <所属>広報課</所属> <役職>主任</役職> </社員> </社員情報> リスト2 <?xml version="1.0" encoding="Shift_JIS" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xml:lang="ja"> <xsl:template match="/">

<HTML lang="ja">

<TITLE>社員名簿 -- 通常の一覧形式</TITLE> <BODY>

(7)

</BODY> </HTML> </xsl:template> <xsl:template match="番号"> <DIV> <xsl:value-of/> </DIV> </xsl:template> <xsl:template match="氏名"> <FONT size="3"> <xsl:value-of/> </FONT> </xsl:template> <xsl:template match="所属"> <FONT size="3"> <xsl:value-of/> </FONT> </xsl:template> <xsl:template match="役職"> <FONT size="3"> <xsl:value-of/> </FONT> </xsl:template> </xsl:stylesheet> リスト3 <?xml version="1.0" encoding="Shift_JIS" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xml:lang="ja"> <xsl:template match="/"> <HTML lang="ja"> <TITLE>社員名簿 -- 社員番号を太字で表示</TITLE> <BODY> <xsl:apply-templates select="//*" /> </BODY> </HTML> </xsl:template> <xsl:template match="番号"> <DIV> <B>社員番号: <xsl:value-of/> </B>

(8)

</DIV> </xsl:template> <xsl:template match="氏名"> <FONT size="3"> <xsl:value-of/> </FONT> </xsl:template> <xsl:template match="所属"> <FONT size="3"> <xsl:value-of/> </FONT> </xsl:template> <xsl:template match="役職"> <FONT size="3"> <xsl:value-of/> </FONT> </xsl:template> </xsl:stylesheet> リスト4 <?xml version="1.0" encoding="Shift_JIS" ?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl" xml:lang="ja"> <xsl:template match="/"> <HTML lang="ja"> <TITLE>社員名簿 -- 枠線付きの表形式で表示</TITLE> <BODY> <TABLE border="2"> <TR> <TH>番号</TH> <TH>氏名</TH> <TH>所属</TH> <TH>役職</TH> </TR> <xsl:apply-templates select="//*" /> </TABLE> </BODY> </HTML> </xsl:template> # 繰り返しデータ <xsl:template match="社員"> <TR> <TD>

(9)

<B><xsl:value-of select="番号"/></B> </TD> <TD> <xsl:value-of select="氏名"/> </TD> <TD> <xsl:value-of select="所属"/> </TD> <TD> <xsl:value-of select="役職"/> </TD> </TR> </xsl:template> </xsl:stylesheet> ボタンでシートが切り替わる 斯うして3つのスタイルシートに依る3通りの表示方法を用意しても、XML 文書内でスタイルシート の指定を記述して居たのでは、表示を変更する度に、下記の様に、XSL スタイルシートの名称を書き換 えなければ成りません。

<?xml-stylesheet type="text/xsl" href="members-a.xsl"?>

其れではXML を利用する意味が無いので、別の HTML ファイルに JavaScript を記述し、其れに依り スタイルシートを切り替える様に仕て観る。 リスト5 の HTML 文書をブラウザで開くと、画面 1 の様に成る。3つのボタンに、先に紹介したスタ イルシート(members-a.xsl、members-b.xsl、members-c.xsl)に依る表示が割り当てられて居るので ボタンをクリックすると、画面2~4 の様に XML 文書の表示が切り替わる。 リスト5 <HTML> <HEAD>

<META http-equiv="Content-Script-Type" content="text/javascript"> <TITLE>スタイルシートの切り替え</TITLE> <xml id="members_xml" src="members04.xml"></xml> <xml id="type_a" src="members-a.xsl"></xml> <xml id="type_b" src="members-b.xsl"></xml> <xml id="type_c" src="members-c.xsl"></xml> <SCRIPT language="JavaScript"> <!-- function ViewTypeA() { viewarea.innerHTML = members_xml.transformNode(type_a.documentElement); }

(10)

function ViewTypeB() { viewarea.innerHTML = members_xml.transformNode(type_b.documentElement); } function ViewTypeC() { viewarea.innerHTML = members_xml.transformNode(type_c.documentElement); } --> </SCRIPT> </HEAD> <BODY> <H3>スタイルシートを切り替えて表示方法を変更します</H3> <P> <FORM>

<INPUT type="button" value="通常の一覧" onClick="ViewTypeA()"> <INPUT type="button" value="番号を太字" onClick="ViewTypeB()"> <INPUT type="button" value="表形式" onClick="ViewTypeC()"> </FORM>

</P>

<DIV id="viewarea">--- データは此処に表示されます ---</DIV> </BODY>

</HTML>

(11)

画面2:[通常の一覧]ボタンをクリック~members-a.xsl に依る表示

画面3:[番号を太字]ボタンをクリック~members-b.xsl に依る表示

(12)

transformNode メソッドを使う JavaScript の詳しい解説は本記事のテーマから外れる為、ソースの詳細な説明は割愛する。要は、 function ViewTypeA() { viewarea.innerHTML = members_xml.transformNode(type_a.documentElement); } の様に仕て、特定のXSL スタイルシートで XML 文書を表示させるメソッドを用意し、

<input type="button" value="通常の一覧" onClick="ViewTypeA()">

と謂う形でボタンのOnClick イベントに割り当てて居る丈で有る。 transformNode メソッドは、XML 文書を指定したスタイルシートに従った表示形式に変換する。書式 は下記の通りで有る。 戻り値 = オブジェクト.transformNode(スタイルシート) 戻り値:返還後の文字列 オブジェクト:XML 文書を保持している DOMDocument オブジェクト スタイルシート:スタイルシートを保持しているDOMDocument オブジェクト

参照

関連したドキュメント

が前スライドの (i)-(iii) を満たすとする.このとき,以下の3つの公理を 満たす整数を に対する degree ( 次数 ) といい, と書く..

被保険者証等の記号及び番号を記載すること。 なお、記号と番号の間にスペース「・」又は「-」を挿入すること。

太宰治は誰でも楽しめることを保証すると同時に、自分の文学の追求を放棄していませ

“〇~□までの数字を表示する”というプログラムを組み、micro:bit

備考 1.「処方」欄には、薬名、分量、用法及び用量を記載すること。

ダウンロードした書類は、 「MSP ゴシック、11ポイント」で記入で きるようになっています。字数制限がある書類は枠を広げず入力してく

とされている︒ところで︑医師法二 0

今までの少年院に関する筆者の記述はその信瀝性が一気に低下するかもしれ