ファイルの一覧の取得と、そのファイルのタイトル一覧作成
1つの報告書を1つのXML文書で作成し、いくつもの報告書が保存されています。この複数のXML文書の<Title>タグの中身を取得して、報告書一覧を作りたいのですが、具体的にどうすればできるのか教えてください。

回答/富士ソフトABC株式会社 技術センター
2001/10/17

 この質問には2つの処理に分けて考える必要があります。1つは特定のディレクトリ内にあるファイルの一覧を取得する処理。そしてもう1つは、XML文書の中の特定の要素(この場合は<TITLE>)からデータを取り出して一覧表示させる処理です。これを、XML文書処理として行いたい、ということでしょう。

 特定のディレクトリ内にあるファイル一覧の取得は、XMLとはまったく関係ないファイル操作の分野になります。もう一方の<TITLE>一覧の作成はDOMで行なう処理です。この2つを、VBScriptを使ってそれぞれ説明していきます。

 プログラムを紹介する前に、以下の設定をしておきます。

  1. 報告書ファイル(XML文書)は、特定のディレクトリ(D:\Report)に格納されている。
  2. サンプルのためXML文書の構造は単純にしてある。今回はサンプルとしてタイトル情報と文書の2つのみを定義している。ファイル名には、いつの報告書なのか分かりやすくするために日付(20010107.xml)を使用する。
    <Report>
        <Title>報告書1</Title>
        <Doc>報告内容</Doc>
    </Report>

  3. 報告書が格納されているディレクトリの情報を定義しているXMLファイル(sample2.xml)を用意しておく。
    <Report>
      <Folder>d:\Report</Folder>
    </Report>

 では、プログラムの処理手順を紹介しましょう。

 まず、ディレクトリの情報を定義しているXML文書を読み込んで取得します。その情報を元にして、ディレクトリのファイル一覧を取得し別のデータファイルへと出力します。

 今度は、このデータファイルをあらためて読み込み、それを元に報告書ファイルを順次読み込んで行き、タイトル情報(<TITLE>)を取得します。取り出したタイトル情報とファイル名をペアにしてXMLデータを構築します。

 すべてのタイトル情報を取得したら、構築したデータをXML文書化。それに対してXSLTスタイルシートを適用し、最終的にWebブラウザに表示します。このとき表示されるタイトルは、ペアとなるファイル名(すなわち日付)によってソートされます。

 では、まずVBScriptが記述されているHTML文書を紹介しましょう(sample2.html)。ここでは、VBScriptを利用してファイル一覧を取得し、そこからタイトル一覧をさらに取得。最後にXSLTスタイルシートを適用して、結果をHTMLに埋め込んでいます。

<SCRIPT language="VBScript" FOR="window" EVENT="onload">
<!--
Dim objDoc, objNd, fpath ……(1)
Set objDoc = CreateObject("Microsoft.XMLDOM")
objDoc.async=false
objDoc.load("sample2.xml")
Set objNd = objDoc.documentElement.childNodes
fpath = objNd.item(0).text

Dim fso, f, f1, fc, s ……(2)
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.GetFolder(fpath)
Set fc = f.Files

s = "<root>" ……(3)
For Each f1 in fc
s = s & "<Report>"
s = s & "<FileName>"
s = s & f1.name
s = s & "</FileName>"
objDoc.load(fpath & "\" & f1.name)
Set objNd = objDoc.documentElement.childNodes
s = s & "<Title>"
s = s & objNd.item(0).text
s = s & "</Title>"
s = s & "</Report>"
Next
s = s & "</root>"

objDoc.loadxml(s) ……(4)

Dim objXSL ……(5)
Set objXSL = CreateObject("Microsoft.XMLDOM")
objXSL.async=false
objXSL.load("sample2.xsl")

document.write(objDoc.transformNode(objXSL)) ……(6)
//-->
</SCRIPT>

 (1)以降で、報告書ファイルが格納されているディレクトリの情報を取得しています。取得した情報は変数(fpath)に格納しています。続いて(2)から始まるブロックで、ファイルオブジェクトを作成して指定されたディレクトリ内のファイル一覧を取得しています。

 (3)から始まるループで取得したファイル一覧を使って、各報告書ファイルのタイトル情報を取得。取得したタイトル情報は、ファイル名とペアにしてXMLデータとして構築します。

 (4)で、objDoc.loadxml(s)により、構築したXMLデータをDOMドキュメントとして読込み、(5)からは、タイトル情報を一覧表示するためのXSLTスタイルシートを読み込みます。(6)で、XSLTスタイルシートを適用して、Webブラウザに表示します。

 タイトルを一覧表示するためのXSLTスタイルシートは次のようになります(sample2.xsl)。

<xsl:template match="/">
<xsl:apply-templates select="root" /> ……(1)
</xsl:template>

<!-- root要素に対するテンプレート -->
<xsl:template match="root">
  <table align="center" border="2" >
    <xsl:for-each select="Report"> ……(2)
      <xsl:sort select="FileName"/> ……(3)
      <xsl:apply-templates select="Title" /> ……(4)
    </xsl:for-each>
  </table>
</xsl:template>

<!-- Title要素に対するテンプレート -->
<xsl:template match="Title">
  <tr>
    <td><xsl:value-of select="."/></td> ……(5)
  </tr>
</xsl:template>

 (1)で、root要素に対して別のテンプレートを使用することを宣言。(2)で、Report要素がなくなるまで繰り返し処理を行い、(3)で、FileName要素でソートします。(4)で、Title要素に対して、別のテンプレートを使用することを宣言。(5)で、Title情報を取り出して、表データに埋め込みます。

 以上がWindows環境におけるローカルなPC上での方法となります。

■サーバで実装する場合

 さて、ここで紹介したことをサーバ環境で実現するには、スクリプトを実行するファイルをサーバ環境に合わせる必要があります。WebサーバとしてIISを使う場合には、VBScriptの実行やXSLTの呼び出しを、HTML文書からではなくASPファイルで記述すれば、同じ結果を得ることが可能です。そのほかのXML文書やXSLファイルを変更する必要はありません。

 sample2.aspに、サーバで行う際のサンプルも示しておきます。サーバ環境でのサンプルは、仮想ルートの下に、ASPファイルなどを配置する“サンプル”ディレクトリと、報告書ファイルを配置する“Report”ディレクトリがあると仮定しています。

■Javaで実装する場合

 Windows以外のプラットフォームでも考え方は同じで、使用する言語やオブジェクトが異なるだけです。例えばJavaで記述する場合は、クラスFileのlistFilesメソッドとisFileメソッドを使って一覧を取得します。下のソースはファイル一覧を取出す部分の例です。XMLに関する処理は変わらないのでファイル操作についてのみ例を挙げました。

File dir = "Report";
File[] wklist;
File[] filelist;
int cnt, loop;
wklist = dir.listFiles(); ……(1)

for (loop = 0, cnt = 0; loop < wklist.length; loop++) { ……(2)
  if (wklist[loop].isFile()) {
    filelist[cnt] = wklist[loop];
    cnt++;
  }
}

 (1)で、指定されたディレクトリ下のファイルとディレクトリの一覧を取得し、(2)のループで、取得した一覧からファイルのみを抽出しています。

■今回使用したリスト

 ここで紹介したサンプルのリストをまとめました。

 このサンプルでは、実行結果として報告書一覧が下記のような画面で参照されます。

 

「Ask XML Expert」


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

注目のテーマ

HTML5+UX 記事ランキング

本日月間