プログラマとプロマネのあいだ

プログラマもやるし、プロマネもやるし、たまに似非アーキとか営業っぽいこともやる

DOM(org.w3c.dom.Document)をXMLテキストに変換する

これもまたRestletのソースを読んでて気づいたのですが、javax.xml.transform.*系のAPIは、XSLTXML文書を変換するためのものとばかり思っていたのですが、実はそのままXMLのテキストとして得ることも可能だということが分かりました。
というわけで、サンプルコードを書いてみました。サンプルのXMLファイルとXSLファイルは、以下のサイトから入手しました。
http://www.atmarkit.co.jp/fxml/tanpatsu/xslt/xslt01.html
要は、TransformerFactoryからTransformerを取得する際に、Sourceを指定すればXSLTの変換がかかって、指定しなければそのまま出力されるということのようです。知らなかったなぁ。。
■ソース

import java.io.FileInputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class Test {
	public static void main(String[] args) throws Exception
	{
		FileInputStream inputStreamXml = null;
		FileInputStream inputStreamXsl = null;

		try
		{
			// ファイルからDOMツリーを形成
			inputStreamXml = new FileInputStream("test.xml");

			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
			Document document = dBuilder.parse(inputStreamXml);

			// DOMツリーからXMLテキストを取り出す
			inputStreamXsl = new FileInputStream("test.xsl");
			
			TransformerFactory tFactory = TransformerFactory.newInstance();
			// ↓を使うとXSLを適用せずにそのまま出力
			Transformer transformer = tFactory.newTransformer();
			// ↓を使うとXSLを適用して出力
			//Transformer transformer = tFactory.newTransformer(new SAXSource(new InputSource(inputStreamXsl)));
			transformer.transform(new DOMSource(document), new StreamResult(System.out));
		}
		finally
		{
			if(inputStreamXml != null)
			{
				inputStreamXml.close();
			}
			if(inputStreamXsl != null)
			{
				inputStreamXsl.close();
			}
		}
	}
}

■変換しなかった場合の出力

<?xml version="1.0" encoding="UTF-8"?><PAGE>
  <EMPLOYEES>
    <EMPLOYEE>
      <EMPNO>1</EMPNO>
      <ENAME>菴宣㍽蜉?</ENAME>
      <JOB>President</JOB>
      <HIREDATE>1990-04-01</HIREDATE>
      <SAL>10000</SAL>
      <DEPTNO>10</DEPTNO>
    </EMPLOYEE>
    <EMPLOYEE>
      <EMPNO>50</EMPNO>
      <ENAME>鬮俶ゥ区沸蟄?</ENAME>
      <JOB>Director</JOB>
      <MGR>1</MGR>
      <HIREDATE>1991-04-01</HIREDATE>
      <SAL>6000</SAL>
      <DEPTNO>30</DEPTNO>
    </EMPLOYEE>
    <EMPLOYEE>
      <EMPNO>1401</EMPNO>
      <ENAME>蟆丞アア蟆壼スヲ</ENAME>
      <JOB>Analyst</JOB>
      <MGR>50</MGR>
      <HIREDATE>1999-09-01</HIREDATE>
      <SAL>3000</SAL>
      <DEPTNO>30</DEPTNO>
    </EMPLOYEE>
  </EMPLOYEES>
</PAGE>

■変換した場合の出力

<HTML>
<BODY>
  
    佐野力<BR>
    高橋敦子<BR>
    小山尚彦<BR>
  

</BODY>
</HTML>