Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

8. Transformer

8.1 Transformer

これまで、DOMツリーをXML文書として出力するために、Transformerオブジェクトを使用してきました。Transfomerは、JAXP付属のXSLTプロセッサーです。Transformerは、XMLのソースツリーを結果ツリーに変換するオブジェクトです。DOMに限らず、XSLT スタイルシートに基づいてXMLを変換することも可能です。

8.2 基本的な変換

それでは、Transformerを使用したXMLの変換について、見ていきましょう。people.xmlを、sample.xslにしたがって変換します。

sample.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="person">A Person</xsl:template>
</xsl:stylesheet>
people.xml
<?xml version="1.0"?>
<people>
<person born="1912" died="1954">
<name>
<first_name>Alan</first_name>
<last_name>Turing</last_name>
</name>
<profession>computer scientist</profession>
<profession>mathematician</profession>
<profession>cryptographer</profession>
</person>
<person born="1918" died="1988">
<name>
<first_name>Richard</first_name>
<middle_initial>P</middle_initial>
<last_name>Feynman</last_name>
</name>
<profession>physicist</profession>
<hobby>playing the bongoes</hobby>
</person>
</people>

プログラムは以下のようになります。

 1:  import javax.xml.transform.TransformerFactory;
2: import javax.xml.transform.Transformer;
3: import javax.xml.transform.Source;
4: import javax.xml.transform.Result;
5: import javax.xml.transform.stream.StreamSource;
6: import javax.xml.transform.stream.StreamResult;
7:
8: import java.io.File;
9: import java.io.FileOutputStream;
10:
11: public class TransformerSample{
12:
13: public static void main(String args[]) throws Exception{
14:
15: Source xsltSource=new StreamSource(new File("sample.xsl"));
16:
17: TransformerFactory transFactory = TransformerFactory.newInstance();
18: Transformer transformer = transFactory.newTransformer(xsltSource);
19:
20: Source source = new StreamSource(new File("people.xml"));
21: Result result = new StreamResult(System.out);
22: transformer.transform(source, result);
23:
24: }
25:
26: }

まず、Transformerインスタンスを取得します。TransformerオブジェクトはTranformerFactoryのnewTransformerメソッドを使用して取得します。17行目で、TransfomerFactoryのnewInstance()メソッドを使用し、TransformerFactoryのインスタンスを取得しています。18行目でTransformerFactoryのnewTransformerメソッドを使用して、Transformerのインスタンスを取得しています。newTranformerの引数には、スタイルシートを指定します。スタイルシートとして、Sourceインタフェースを実装したオブジェクトインスタンスを指定します。ここでは、sample.xsl ファイルより生成したStreamSourceオブジェクトを引数に指定しています。

 Sourceインタフェースについて、もう少し説明しましょう。Sourceインタフェースは、与えられたXMLをTransformerが処理するのに必要なメソッドを提供します。変換元となるXMLもSourceインタフェースを実装したオブジェクトに変換してから、Transformerに渡します。Sourceインタフェースを実装しているクラスには、DOMSource、SAXSource、StreamSourceがあります。 ソースがDOMツリー形式で与えられている場合は、DOMSourceインスタンスを作成します。DOMSourceのコンストラクタの引数にノードを指定すると、指定されたノードをルートノードとするソースツリーが形成されます。ファイルやInputStreamからソースツリーを作る場合は、StreamSourceを利用します。StreamSourceには、以下のようなコンストラクタがあります。

メソッド 内容

public StreamSource(InputStream inputStream)

バイトストリームから StreamSource を構築します。
public StreamSource(Reader reader) 文字リーダから StreamSource を構築します。
public StreamSource(String systemId) URL から StreamSource を構築します。
public StreamSource(File f) File から StreamSource を構築します。

  スタイルシートのSourceをStreamSource(InputStream)コンストラクタで取得した場合には注意が必要です。相対 URI 参照を解決できるようにしたい場合は、setSystemId メソッドを呼び出しベースとなるURIを設定する必要があります。

 変換後の結果ツリーはResultにより管理されます。Result実装クラスの中で最もよく使用するのはStreamResultクラスでしょう。StreamResultクラスでは、以下のコンストラクタを持ちます。コンストラクタの引数で、出力先を指定しています。

メソッド 内容

public StreamResult(OutputStream outputStream)

バイトストリームから StreamResult を構築します。
public StreamResult(Writer writer) 文字ストリームから StreamResult を構築します。
public StreamResult(String systemId) URL から StreamResult を構築します。
public StreamResult(File f) File から StreamResult を構築します。

例えば、StreamResult(File)コンストラクタを使用して、Resultを構築した場合、結果ツリーはXML文書として引数に指定されたファイルに出力されます。

 もう一度、プログラムを確認してみましょう。20行目で、ソースファイルpeople.xmlを指定してSourceを構築しています。21行目では、出力先として標準出力を指定し、Resultを構築しています。最後にTranformerのtransformメソッドを使用して、XMLを変換しています。transformメソッドは、一つ目の引数にSource、2つ目の引数にResultを取ります。

 このプログラムを実行すると、以下のように変換結果が標準出力に表示されます。

$  java TransformerSample
<?xml version="1.0" encoding="UTF-8"?>

A Person
A Person

(実習課題1)

8.2で例に挙げたプログラムを修正しなさい。実行時の引数に、変換元となるXMLファイルを指定できるようにしなさい。また、XMLファイルをいろいろ作成し、実行結果を確認しなさい。

解答例はこちら



前のページへ TECHSCOREのTOPページへ 次のページへ
TECHSCORE PR
PR
PR
PR
PR
PR

techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa