ソースコードの解説
サンプルデータの生成
最初はサンプルデータを生成している部分になります。
//header Map header = new HashMap(); header.put( "TANTOU_NAME", "○×" ); //detail List detail = new ArrayList(); Map detail1 = new HashMap(); detail1.put( "DATE", "5月22日" ); detail1.put( "ITEM", "バナナ" ); ...(省略)
便宜上見やすくするために、はじめにすべてのデータをListおよびMapに入れています。keyとなる部分はDBからの項目名などを想定しています。ヘッダ部、明細部、フッター部に分けて格納します。
DOMを使用したXMLデータの生成
次はXMLを生成する部分です。
生成したサンプルデータを元に、DOMを使用してXMLを生成しています。固定のノードdata、header、detail、footerを生成し、ぞれぞれの配下に動的なノードを生成してます。以下のようなイメージです。
data |----header | |-----動的なノード | |----detail | |-----動的なノード | |----footer | |-----動的なノード
ソースコードはこの部分が該当します。
//xmlデータ生成(DOM) DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = dbfactory.newDocumentBuilder(); Document document = docbuilder.newDocument(); Element root = document.createElement("data"); document.appendChild(root); if( header != null ){ Element sub = document.createElement("header"); root.appendChild( sub ); for( Iterator iterator =header.entrySet().iterator(); iterator.hasNext(); ){ Map.Entry e = (Map.Entry)iterator.next(); header.get( e.getKey() ); Element key = document.createElement( (String)e.getKey() ); sub.appendChild( key ); Text text = document.createTextNode( (String)header.get( e.getKey() ) ); key.appendChild( text ); } } if( detail != null ){ for ( int i=0; i < detail.size(); i++ ){ Element sub = document.createElement("detail"); root.appendChild( sub ); Map map = (Map)detail.get(i); for( Iterator iterator =map.entrySet().iterator(); iterator.hasNext(); ){ Map.Entry e = (Map.Entry)iterator.next(); map.get( e.getKey() ); Element key = document.createElement( (String)e.getKey() ); sub.appendChild( key ); Text text = document.createTextNode( (String)map.get( e.getKey() ) ); key.appendChild( text ); } } } if( footer != null ){ Element sub = document.createElement("footer"); root.appendChild( sub ); for( Iterator iterator =footer.entrySet().iterator(); iterator.hasNext(); ){ Map.Entry e = (Map.Entry)iterator.next(); footer.get( e.getKey() ); Element key = document.createElement( (String)e.getKey() ); sub.appendChild( key ); Text text = document.createTextNode( (String)footer.get( e.getKey() ) ); key.appendChild( text ); } }
生成されるXMLデータ
生成されるXMLデータは以下のようになります。
<data> <header> <TANTOU_NAME>○×</TANTOU_NAME> </header> <detail> <DATE>5月22日</DATE> <ITEM>バナナ</ITEM> <QUANTITY>100</QUANTITY> <PRICE>200</PRICE> <MONEY>20,000</MONEY> </detail> <detail> <DATE>5月23日</DATE> <ITEM>みかん</ITEM> <QUANTITY>120</QUANTITY> <PRICE>50</PRICE> <MONEY>6,000</MONEY> </detail> <detail> <DATE>5月23日</DATE> <ITEM>バナナ</ITEM> <QUANTITY>100</QUANTITY> <PRICE>100</PRICE> <MONEY>10,000</MONEY> </detail> <footer> <MAIL>hoge@sample.com</MAIL> </footer> </data>
ここでは分かりやすいようにノードを大文字、小文字を意識的に区別して使用しています。
XSLTファイルレイアウトに合わせて変換
最後にXSLTファイルを取得し、XMLデータをXSLTファイルのレイアウトに合わせて文字列に変換します。変換された文字列をメールの本文に組み込むことで、XSLTファイルのレイアウトでメールを配信することができます。
//XSLTファイル取得 String sXsl = "file:///sample01.xsl"; StringWriter sw = new StringWriter(); StreamResult sr = new StreamResult( sw ); TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newTransformer( new StreamSource( sXsl ) ); transformer.transform( new DOMSource(document), sr ); String result = StringUtils.remove( sw.toString(), "\r" ); return result;