XML工房

〔作品1〕PCのフォルダツリーを表示する

~第3章~ XSLTスタイルシートの作成

2005年10月号掲載記事

前回の最後にPCのフォルダツリーを表示するプログラムを紹介しましたので、今回はそのプログラムの内容を解説します。プログラムはDOMプログラミングを使用しています。
Dir2XMLクラスの処理の概要は次のようなものです。

Dir2XMLクラス {
  mainメソッド {
   makeXMLメソッドの実行
    ↓
   processFileメソッドの実行(再帰処理による繰り返し)
    ↓
   serializeXMLメソッドの実行
  }
}

・makeXMLメソッド…J2SE 5に含まれる、XMLを処理する標準APIであるJAXPを使用し、新しいXMLドキュメントノード(変数xmlDocument)を作成します。

・processFileメソッド…処理の中心となるメソッドです。フォルダツリーを一つひとつたどり、処理対象がファイルならFile要素を作成しXMLドキュメントツリーに加えます。処理対象がディレクトリならDir要素を作成し、それをXMLドキュメントツリーに加えた後、さらにディレクトリ内部を再帰処理します。これにより、フォルダツリーの情報をXMLデータ化することができます。

・serializeXMLメソッド…同じくJAXPを使用し、XMLドキュメントノード(変数xmlDocument)をXMLファイルとして出力します。

processFileメソッドの中の、再帰処理(コメント行(//親ノードを変更し…)以降の6行)について補足します。処理対象がディレクトリであるということは、そのディレクトリ内部にファイルもしくはディレクトリが存在する可能性があるということですので、そちらを再帰処理します。その際、ディレクトリ内部に処理が移るということは、XMLツリーの親ノードが変わる(たった今新しく加えた要素が親ノードとなる→ parentNode = activeElement;)ということであり、また再帰処理を抜けたときにもXMLツリーの親ノードが変わる(もとのノードに戻る→ parentNode = parentNode.getParentNode();)ということですので、再帰呼び出しの前後でXMLの親ノードを変更しています。

それでは続いて、出力されたXMLファイルからデータを抽出し、書式を整えることのできるXSLTスタイルシートの作成に進みましょう。

最初に、すべてのDir要素の情報(フォルダ名とフォルダ容量)を出力する基本的なスタイルシートを紹介します。

変換後の結果は以下のようになります。

─────────────────────────────
My Documents(1,666,367)
My Music(1,374,494)
Sample Music(1,374,386)
My Pictures(289,153)
Sample Pictures(289,046)
My Webs(1,544)
images(0)
_private(0)
_vti_cnf(0)
_vti_pvt(1,544)
─────────────────────────────

このような変換を行うXSLTスタイルシートは次のようなものとなります。

─────────────────────────────
<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text" encoding="Shift_JIS"/>

  <!--エントリポイント-->
  <xsl:template match="/">
   <xsl:apply-templates select="//Dir"/>
  </xsl:template>

  <!--Dir要素のためのテンプレート-->
  <xsl:template match="Dir">
   <!--「フォルダ名(フォルダ容量)改行」の出力-->
   <xsl:value-of select="@Name"/>
   <xsl:text>(</xsl:text>
   <xsl:value-of select="format-number(sum(.//@Size), ',###')"/>
   <xsl:text>)&#xA;</xsl:text>
  </xsl:template>
</xsl:stylesheet>
─────────────────────────────

またJavaでXSLT変換を行うには、次のようなプログラムを実行します。
このXSLTExecクラスは、実行時の第1引数であるXMLファイルを、第2引数であるXSLTスタイルシートで変換し、そして第3引数であるファイルに変換結果を出力します。プログラムの動作確認はJ2SE 5で行っています。

>Java XSLTExec output.xml sample.xsl output.txt

─────────────────────────────
import java.io.FileOutputStream;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

public class XSLTExec {

 /**
  * エントリポイント.
  * @param args コマンドライン引数
  */
 public static void main(String[] args) {
  if (args.length < 3) {
   System.out.println(
     "usage: XSLTExec XML-file XSLT-stylesheet Output-file");
   return;
  }
  String xml = args[0];
  String xslt = args[1];
  String output = args[2];

  try {
   TransformerFactory tf = TransformerFactory.newInstance();

   Transformer tr = tf.newTransformer(new StreamSource(xslt));
   tr.transform(new StreamSource(xml),
    new StreamResult(new FileOutputStream(output)));

   System.out.println("Output to " + output);
  } catch (Exception e) {
   System.out.println(e);
  }
 }
}
─────────────────────────────

それでは次回はXSLTスタイルシートを改良し、次のような機能を盛り込みたいと思います。

  • フォルダ階層に従ってインデントを加える(「|」や「└」記号を付与する)
  • フォルダ容量の大きさでソートする
  • フォルダ容量の大きさであるバイト数を、KBやMBで表示する
  • 指定の階層レベルまで処理し、その先の階層を処理しない

皆さんならどんなスタイルシートを作成しますか?

続きの第4章はこちら

「XML工房」のIndexへ戻る

ページトップへ▲

HOMEへ戻る