DOM(org.w3c.dom.Document)をXMLテキストに変換する
これもまたRestletのソースを読んでて気づいたのですが、javax.xml.transform.*系のAPIは、XSLTでXML文書を変換するためのものとばかり思っていたのですが、実はそのまま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>