__ <?xml version="1.0" encoding="UTF-8"?> <s_songs> <song_info> <title>Groove in the heart</title> <counts>32</counts> <remarks>Deee lite, 1990</remarks> </song_info> <main_synth_info> <substitute>34: E Bass</substitute> <vco1>Sqr,4</vco1> <vco2></vco2> <lfo></lfo> <lpf>3,3</lpf> <hpf></hpf> <adsr>0,3,4,3</adsr> <other>Portamento=0, LFO=0</other> <remarks>Sound like a E Bass</remarks> </main_synth_info> <note_info> <main_synth> 12,,,,22,,19,,24,,22,,19,,17,,,,27,,,,29,,27,,24,,22,23,24 </main_synth> <main_synth_gate> 1,,,0,1,,1,,1,,1,,1,,1,,,0,1,,,0,1,,1,,1,,1,1,1 </main_synth_gate> <midi_drum_1 id=1> 1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,, </midi_drum_1> <midi_drum_2></midi_drum_2> <midi_drum_3></midi_drum_3> <midi_drum_4></midi_drum_4> <midi_ens_1 channel=2 prog="1:Piano"> 1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,, </midi_ens_1> <midi_ens_2></midi_ens_2> <midi_ens_3></midi_ens_3> <midi_ens_4></midi_ens_4> <wave file="blblblbl.wav"> ,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,, </midi_drum_1> </note_info> </s_songs> <audio id="audio" controls> <script type="text/javascript"> ____---------------------------------------- __ JavaでXML文書を記述しファイルへ書きこむ XML文書をJavaで読み書きすることが業務で結構ありそうな気配なので,今のうちに予習の意味を込めてそのプログラムを書いてみました.ここではまず,XML文を記述し,それをファイルへと書きこむ処理について書いています. はじめに,XMLの用語統一のため,ここでは用語を次のように使っています. 要素とは,<要素名 属性名="属性値">要素内容 属性とは,属性名="属性値" 子要素とは,ある要素に含まれた要素 ソースコード import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; public class WriteXML { public static void main(String[] args) { // Documentインスタンスの生成 DocumentBuilder documentBuilder = null; try { documentBuilder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); } catch (ParserConfigurationException e) { e.printStackTrace(); } Document document = documentBuilder.newDocument(); // XML文書の作成 Element human = document.createElement("human"); document.appendChild(human); Element japanese = document.createElement("japanese"); japanese.setAttribute("sex", "male"); japanese.appendChild(document.createTextNode("Taro")); human.appendChild(japanese); // XMLファイルの作成 File file = new File("Human.xml"); write(file, document); } public static boolean write(File file, Document document) { // Transformerインスタンスの生成 Transformer transformer = null; try { TransformerFactory transformerFactory = TransformerFactory .newInstance(); transformer = transformerFactory.newTransformer(); } catch (TransformerConfigurationException e) { e.printStackTrace(); return false; } // Transformerの設定 transformer.setOutputProperty("indent", "yes"); //改行指定 transformer.setOutputProperty("encoding", "Shift_JIS"); // エンコーディング // XMLファイルの作成 try { transformer.transform(new DOMSource(document), new StreamResult( file)); } catch (TransformerException e) { e.printStackTrace(); return false; } return true; } } 実行して得られた「Human.xml」 <?xml version="1.0" encoding="Shift_JIS"?> <human> <japanese sex="male">Taro</japanese> </human> メイン処理は大きく3つです. 1.Documentインスタンスの作成 DocumentBuilderは,XML文書からDOM(Document Object Model)のDocumentインスタンスを取得するAPIを提供しています.DOMとはXML文章やHTML文書にアクセスするためのオブジェクトモデルとその標準インタフェースに関する規格だそうです.DocumentBuilder.newDocumentメソッドを利用して,DOMオブジェクトの新しいインスタンスをdocumentとして保持します. 2.XML文書の作成 documentメソッドを利用して,要素や属性を作成します.次のようなメソッドを利用します. createElement 要素の作成 appendChild 子要素の追加 setAttribute 属性名と属性値の設定 createText 要素内容の作成 3.XMLファイルの作成 JavaでDOMを参照して書きました.Transformerはソースコードを結果ツリーへと変換する処理を提供しています.Transformerインスタンスを生成し,そこに改行指定やエンコーディングの設定をした後,trasformメソッドでXMLファイルを作成しています. __ Java Tips - DOM - XMLドキュメントの要素に属性を追加するには DOM(Document Object Model)を使用して、XMLドキュメントの要素に属性を追加する手順は以下の通りです。 DocumentクラスのcreateElementメソッドを使用して、要素を生成します。 ElementクラスのsetAttributeメソッドを使用して、上記で生成した要素に属性を設定します。 ----------------------- package net.tk_factory.example.xml.dom; import java.io.File; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; import net.tk_factory.example.AbstractExample; /** * DOM(Document Object Model)を使用したサンプルプログラムです。<br/> * <br/> * <b>内容</b> * <ol type="1"> * <li>XMLドキュメントの要素に属性を設定します。</li> * </ol> * * @author Takafumi Kondo (TK Factory) */ public class ExampleSetAttribute extends AbstractExample { /** クラス名 */ private static final String CLASS_NAME = ExampleSetAttribute.class.getSimpleName(); /** ロガー */ private static final Logger LOGGER = Logger.getLogger(ExampleSetAttribute.class.getName()); /** 出力ファイル名 */ private static final String OUT_FILE_NAME = EXAMPLE_FILE_DIRECTORY + CLASS_NAME + ".xml"; /** * ExampleSetAttributeオブジェクトを構築すると、 * UnsupportedOperationExceptionがスローされます。<br/> */ protected ExampleSetAttribute() { throw new UnsupportedOperationException(); } /** * mainメソッドです。<br/> * * @param args 引数 */ public static void main(String[] args) { LOGGER.info("[START]" + CLASS_NAME); try { //XMLドキュメントを作成する DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docbuilder = dbfactory.newDocumentBuilder(); Document document = docbuilder.newDocument(); //ルート要素を作成する Element root = document.createElement("root"); document.appendChild(root); //ルート要素に子要素を追加する Element child = document.createElement("child"); //子要素に属性を設定する child.setAttribute("attr", "1"); root.appendChild(child); //XMLドキュメントをファイルに出力する TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer transformer = tfactory.newTransformer(); File file = new File(OUT_FILE_NAME); transformer.transform(new DOMSource(document), new StreamResult(file)); } catch (ParserConfigurationException ex) { //DocumentBuilderオブジェクトの作成に失敗した場合 LOGGER.error(getStackTrace(ex)); } catch (TransformerConfigurationException ex) { //Transformerオブジェクトの作成に失敗した場合 LOGGER.error(getStackTrace(ex)); } catch (TransformerException ex) { //XMLドキュメントをファイルに出力する際にエラーが発生した場合 LOGGER.error(getStackTrace(ex)); } LOGGER.info("[E N D]" + CLASS_NAME); } } 作成されるXMLファイルは以下通りです。 <?xml version="1.0" encoding="UTF-8"?> <root> <child attr="1"/> </root> __ XML DOMをJavaで生成して出力する import java.io.StringWriter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.transform.OutputKeys; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl; // >>>>> DOMオブジェクトの作成までのおきまりのコード DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.newDocument(); // <<<<< DOMオブジェクトの作成までのおきまりのコード // >>>>> DOMの生成 Element test = document.createElement("test");//<-rootドキュメント // test.setAttribute("xmlns", "testns");//<-属性の設定があればこのように書く // test.setAttribute("xmlns:xsi", "testxsi"); // test.setAttribute("xsi:schemaLocation", "xchema"); document.appendChild(test); Element message = document.createElement("message"); test.appendChild(message); Text textMessage = document.createTextNode("こんにちは Java XML プログラミング"); message.appendChild(textMessage); // <<<<< DOMの生成 // >>>>> DOMをStringに変換するおきまりのコード // ここでは、インデントを有効にするためTransformerFactoryImplを使用している。 TransformerFactory tf = TransformerFactoryImpl.newInstance(); tf.setAttribute(TransformerFactoryImpl.INDENT_NUMBER, "2");// インデントは実装依存なのかー Transformer transformer = tf.newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); transformer.setOutputProperty(OutputKeys.METHOD, "xml"); // インデントについては以下のようにも書ける // transformer.setOutputProperty(org.apache.xalan.templates.OutputProperties.S_KEY_INDENT_AMOUNT, "2"); // 2010.02.15追記 // 上記は、環境によってコンパイルエラーになってしまうことがあった。 // 代わりに以下の様に記述したらOKだった。(参照:http://d.hatena.ne.jp/toolkit/20060721/p1) // transformer.setOutputProperty(org.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2"); // この場合 // tf.setAttribute(TransformerFactoryImpl.INDENT_NUMBER, "2"); // はいらない。ファクトリ生成部分を以下のようにかけるから // TransformerFactory tf = TransformerFactory.newInstance(); // こっちのほうがいいね。 // ここを参照 http://www.mclnet.co.jp/tech/java/xml/pretty.html StringWriter writer = new StringWriter();// <-ここでは文字列として出力している StreamResult result = new StreamResult(writer); DOMSource source = new DOMSource(document); transformer.transform(source, result); System.out.println(writer.toString()); // <<<<< DOMをStringに変換するおきまりのコード 実行結果 <?xml version="1.0" encoding="UTF-8" standalone="no"?> <test> <message>こんにちは Java XML プログラミング</message> </test> __ XMLファイルの出力[DOMImplementation] データベースから情報を読み込んで、XMLファイルを出力するサンプルです。 下記の例はファイルに出力していますが、サーブレットでWEBに出力する場合は、 response.getOutputStream() で出力ストリームを出力し、StreamResult に渡します。 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); DOMImplementation domImpl=builder.getDOMImplementation(); Document document = domImpl.createDocument("","店舗情報",null); Element root = document.getDocumentElement(); String sql = "select * from 会員情報"; Statement state = con.createStatement(); ResultSet res = state.executeQuery(sql); while (res.next()) { Element kaiin = document.createElement("会員情報"); int kno = res.getInt("番号"); String name = res.getString("氏名"); String tel = res.getString("電話番号"); Timestamp time = res.getTimestamp("登録日時"); Element noNode = document.createElement("会員番号"); Element nameNode = document.createElement("氏名"); Element telNode = document.createElement("電話番号"); Element timeNode = document.createElement("登録日時"); noNode.appendChild(document.createTextNode(""+kno)); nameNode.appendChild(document.createTextNode(name)); telNode.appendChild(document.createTextNode(tel)); timeNode.appendChild(document.createTextNode(time.toString())); kaiin.appendChild(noNode); kaiin.appendChild(nameNode); kaiin.appendChild(telNode); kaiin.appendChild(timeNode); root.appendChild(kaiin); } //出力 TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = transFactory.newTransformer(); DOMSource source = new DOMSource(document); File newXML = new File("newXML.xml"); FileOutputStream os = new FileOutputStream(newXML); StreamResult result = new StreamResult(os); transformer.transform(source, result); 出力結果は以下のようになります。 <?xml version="1.0" encoding="UTF-8"?> <店舗情報> <会員情報> <会員番号>1</会員番号> <氏名>山田太郎</氏名> <電話番号>090-1111-2222</電話番号> <登録日時>2007-12-11 14:51:22.102</登録日時> </会員情報> <会員情報> <会員番号>2</会員番号> <氏名>鈴木花子</氏名> <電話番号>090-1111-3333</電話番号> <登録日時>2007-12-11 14:51:38.678</登録日時> </会員情報> </店舗情報>