XMLファイルの出力-DOM

形式
Plain text
投稿日時
2014-06-26 15:12
公開期間
無期限
  1. __
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <s_songs>
  4. <song_info>
  5. <title>Groove in the heart</title>
  6. <counts>32</counts>
  7. <remarks>Deee lite, 1990</remarks>
  8. </song_info>
  9. <main_synth_info>
  10. <substitute>34: E Bass</substitute>
  11. <vco1>Sqr,4</vco1>
  12. <vco2></vco2>
  13. <lfo></lfo>
  14. <lpf>3,3</lpf>
  15. <hpf></hpf>
  16. <adsr>0,3,4,3</adsr>
  17. <other>Portamento=0, LFO=0</other>
  18. <remarks>Sound like a E Bass</remarks>
  19. </main_synth_info>
  20. <note_info>
  21. <main_synth>
  22. 12,,,,22,,19,,24,,22,,19,,17,,,,27,,,,29,,27,,24,,22,23,24
  23. </main_synth>
  24. <main_synth_gate>
  25. 1,,,0,1,,1,,1,,1,,1,,1,,,0,1,,,0,1,,1,,1,,1,1,1
  26. </main_synth_gate>
  27. <midi_drum_1 id=1>
  28. 1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,
  29. </midi_drum_1>
  30. <midi_drum_2></midi_drum_2>
  31. <midi_drum_3></midi_drum_3>
  32. <midi_drum_4></midi_drum_4>
  33. <midi_ens_1 channel=2 prog="1:Piano">
  34. 1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,1,,,,
  35. </midi_ens_1>
  36. <midi_ens_2></midi_ens_2>
  37. <midi_ens_3></midi_ens_3>
  38. <midi_ens_4></midi_ens_4>
  39. <wave file="blblblbl.wav">
  40. ,,,,,,,,,,,,1,,,,,,,,,,,,,,,,,,,,
  41. </midi_drum_1>
  42. </note_info>
  43. </s_songs>
  44. <audio id="audio" controls>
  45. <script type="text/javascript">
  46. ____----------------------------------------
  47. __
  48. JavaでXML文書を記述しファイルへ書きこむ
  49. XML文書をJavaで読み書きすることが業務で結構ありそうな気配なので,今のうちに予習の意味を込めてそのプログラムを書いてみました.ここではまず,XML文を記述し,それをファイルへと書きこむ処理について書いています.
  50. はじめに,XMLの用語統一のため,ここでは用語を次のように使っています.
  51. 要素とは,<要素名 属性名="属性値">要素内容
  52. 属性とは,属性名="属性値"
  53. 子要素とは,ある要素に含まれた要素
  54. ソースコード
  55. import java.io.File;
  56. import javax.xml.parsers.DocumentBuilder;
  57. import javax.xml.parsers.DocumentBuilderFactory;
  58. import javax.xml.parsers.ParserConfigurationException;
  59. import javax.xml.transform.Transformer;
  60. import javax.xml.transform.TransformerConfigurationException;
  61. import javax.xml.transform.TransformerException;
  62. import javax.xml.transform.TransformerFactory;
  63. import javax.xml.transform.dom.DOMSource;
  64. import javax.xml.transform.stream.StreamResult;
  65. import org.w3c.dom.Document;
  66. import org.w3c.dom.Element;
  67. public class WriteXML {
  68. public static void main(String[] args) {
  69. // Documentインスタンスの生成
  70. DocumentBuilder documentBuilder = null;
  71. try {
  72. documentBuilder = DocumentBuilderFactory.newInstance()
  73. .newDocumentBuilder();
  74. } catch (ParserConfigurationException e) {
  75. e.printStackTrace();
  76. }
  77. Document document = documentBuilder.newDocument();
  78. // XML文書の作成
  79. Element human = document.createElement("human");
  80. document.appendChild(human);
  81. Element japanese = document.createElement("japanese");
  82. japanese.setAttribute("sex", "male");
  83. japanese.appendChild(document.createTextNode("Taro"));
  84. human.appendChild(japanese);
  85. // XMLファイルの作成
  86. File file = new File("Human.xml");
  87. write(file, document);
  88. }
  89. public static boolean write(File file, Document document) {
  90. // Transformerインスタンスの生成
  91. Transformer transformer = null;
  92. try {
  93. TransformerFactory transformerFactory = TransformerFactory
  94. .newInstance();
  95. transformer = transformerFactory.newTransformer();
  96. } catch (TransformerConfigurationException e) {
  97. e.printStackTrace();
  98. return false;
  99. }
  100. // Transformerの設定
  101. transformer.setOutputProperty("indent", "yes"); //改行指定
  102. transformer.setOutputProperty("encoding", "Shift_JIS"); // エンコーディング
  103. // XMLファイルの作成
  104. try {
  105. transformer.transform(new DOMSource(document), new StreamResult(
  106. file));
  107. } catch (TransformerException e) {
  108. e.printStackTrace();
  109. return false;
  110. }
  111. return true;
  112. }
  113. }
  114. 実行して得られた「Human.xml」
  115. <?xml version="1.0" encoding="Shift_JIS"?>
  116. <human>
  117. <japanese sex="male">Taro</japanese>
  118. </human>
  119. メイン処理は大きく3つです.
  120. 1.Documentインスタンスの作成
  121. DocumentBuilderは,XML文書からDOM(Document Object Model)のDocumentインスタンスを取得するAPIを提供しています.DOMとはXML文章やHTML文書にアクセスするためのオブジェクトモデルとその標準インタフェースに関する規格だそうです.DocumentBuilder.newDocumentメソッドを利用して,DOMオブジェクトの新しいインスタンスをdocumentとして保持します.
  122. 2.XML文書の作成
  123. documentメソッドを利用して,要素や属性を作成します.次のようなメソッドを利用します.
  124. createElement 要素の作成
  125. appendChild 子要素の追加
  126. setAttribute 属性名と属性値の設定
  127. createText 要素内容の作成
  128. 3.XMLファイルの作成
  129. JavaでDOMを参照して書きました.Transformerはソースコードを結果ツリーへと変換する処理を提供しています.Transformerインスタンスを生成し,そこに改行指定やエンコーディングの設定をした後,trasformメソッドでXMLファイルを作成しています.
  130. __
  131. Java Tips - DOM - XMLドキュメントの要素に属性を追加するには
  132. DOM(Document Object Model)を使用して、XMLドキュメントの要素に属性を追加する手順は以下の通りです。
  133. DocumentクラスのcreateElementメソッドを使用して、要素を生成します。
  134. ElementクラスのsetAttributeメソッドを使用して、上記で生成した要素に属性を設定します。
  135. -----------------------
  136. package net.tk_factory.example.xml.dom;
  137. import java.io.File;
  138. import javax.xml.parsers.DocumentBuilder;
  139. import javax.xml.parsers.DocumentBuilderFactory;
  140. import javax.xml.parsers.ParserConfigurationException;
  141. import javax.xml.transform.Transformer;
  142. import javax.xml.transform.TransformerConfigurationException;
  143. import javax.xml.transform.TransformerException;
  144. import javax.xml.transform.TransformerFactory;
  145. import javax.xml.transform.dom.DOMSource;
  146. import javax.xml.transform.stream.StreamResult;
  147. import org.apache.log4j.Logger;
  148. import org.w3c.dom.Document;
  149. import org.w3c.dom.Element;
  150. import net.tk_factory.example.AbstractExample;
  151. /**
  152. * DOM(Document Object Model)を使用したサンプルプログラムです。<br/>
  153. * <br/>
  154. * <b>内容</b>
  155. * <ol type="1">
  156. * <li>XMLドキュメントの要素に属性を設定します。</li>
  157. * </ol>
  158. *
  159. * @author Takafumi Kondo (TK Factory)
  160. */
  161. public class ExampleSetAttribute extends AbstractExample {
  162. /** クラス名 */
  163. private static final String CLASS_NAME =
  164. ExampleSetAttribute.class.getSimpleName();
  165. /** ロガー */
  166. private static final Logger LOGGER =
  167. Logger.getLogger(ExampleSetAttribute.class.getName());
  168. /** 出力ファイル名 */
  169. private static final String OUT_FILE_NAME =
  170. EXAMPLE_FILE_DIRECTORY + CLASS_NAME + ".xml";
  171. /**
  172. * ExampleSetAttributeオブジェクトを構築すると、
  173. * UnsupportedOperationExceptionがスローされます。<br/>
  174. */
  175. protected ExampleSetAttribute() {
  176. throw new UnsupportedOperationException();
  177. }
  178. /**
  179. * mainメソッドです。<br/>
  180. *
  181. * @param args 引数
  182. */
  183. public static void main(String[] args) {
  184. LOGGER.info("[START]" + CLASS_NAME);
  185. try {
  186. //XMLドキュメントを作成する
  187. DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
  188. DocumentBuilder docbuilder = dbfactory.newDocumentBuilder();
  189. Document document = docbuilder.newDocument();
  190. //ルート要素を作成する
  191. Element root = document.createElement("root");
  192. document.appendChild(root);
  193. //ルート要素に子要素を追加する
  194. Element child = document.createElement("child");
  195. //子要素に属性を設定する
  196. child.setAttribute("attr", "1");
  197. root.appendChild(child);
  198. //XMLドキュメントをファイルに出力する
  199. TransformerFactory tfactory = TransformerFactory.newInstance();
  200. Transformer transformer = tfactory.newTransformer();
  201. File file = new File(OUT_FILE_NAME);
  202. transformer.transform(new DOMSource(document), new StreamResult(file));
  203. }
  204. catch (ParserConfigurationException ex) {
  205. //DocumentBuilderオブジェクトの作成に失敗した場合
  206. LOGGER.error(getStackTrace(ex));
  207. }
  208. catch (TransformerConfigurationException ex) {
  209. //Transformerオブジェクトの作成に失敗した場合
  210. LOGGER.error(getStackTrace(ex));
  211. }
  212. catch (TransformerException ex) {
  213. //XMLドキュメントをファイルに出力する際にエラーが発生した場合
  214. LOGGER.error(getStackTrace(ex));
  215. }
  216. LOGGER.info("[E N D]" + CLASS_NAME);
  217. }
  218. }
  219. 作成されるXMLファイルは以下通りです。
  220. <?xml version="1.0" encoding="UTF-8"?>
  221. <root>
  222. <child attr="1"/>
  223. </root>
  224. __
  225. XML DOMをJavaで生成して出力する
  226. import java.io.StringWriter;
  227. import javax.xml.parsers.DocumentBuilder;
  228. import javax.xml.parsers.DocumentBuilderFactory;
  229. import javax.xml.transform.OutputKeys;
  230. import javax.xml.transform.Transformer;
  231. import javax.xml.transform.TransformerFactory;
  232. import javax.xml.transform.dom.DOMSource;
  233. import javax.xml.transform.stream.StreamResult;
  234. import org.w3c.dom.Document;
  235. import org.w3c.dom.Element;
  236. import org.w3c.dom.Text;
  237. import com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl;
  238. // >>>>> DOMオブジェクトの作成までのおきまりのコード
  239. DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
  240. DocumentBuilder db = dbf.newDocumentBuilder();
  241. Document document = db.newDocument();
  242. // <<<<< DOMオブジェクトの作成までのおきまりのコード
  243. // >>>>> DOMの生成
  244. Element test = document.createElement("test");//<-rootドキュメント
  245. // test.setAttribute("xmlns", "testns");//<-属性の設定があればこのように書く
  246. // test.setAttribute("xmlns:xsi", "testxsi");
  247. // test.setAttribute("xsi:schemaLocation", "xchema");
  248. document.appendChild(test);
  249. Element message = document.createElement("message");
  250. test.appendChild(message);
  251. Text textMessage = document.createTextNode("こんにちは Java XML プログラミング");
  252. message.appendChild(textMessage);
  253. // <<<<< DOMの生成
  254. // >>>>> DOMをStringに変換するおきまりのコード
  255. // ここでは、インデントを有効にするためTransformerFactoryImplを使用している。
  256. TransformerFactory tf = TransformerFactoryImpl.newInstance();
  257. tf.setAttribute(TransformerFactoryImpl.INDENT_NUMBER, "2");// インデントは実装依存なのかー
  258. Transformer transformer = tf.newTransformer();
  259. transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
  260. transformer.setOutputProperty(OutputKeys.INDENT, "yes");
  261. transformer.setOutputProperty(OutputKeys.METHOD, "xml");
  262. // インデントについては以下のようにも書ける
  263. // transformer.setOutputProperty(org.apache.xalan.templates.OutputProperties.S_KEY_INDENT_AMOUNT, "2");
  264. // 2010.02.15追記
  265. // 上記は、環境によってコンパイルエラーになってしまうことがあった。
  266. // 代わりに以下の様に記述したらOKだった。(参照:http://d.hatena.ne.jp/toolkit/20060721/p1)
  267. // transformer.setOutputProperty(org.apache.xml.serializer.OutputPropertiesFactory.S_KEY_INDENT_AMOUNT, "2");
  268. // この場合
  269. // tf.setAttribute(TransformerFactoryImpl.INDENT_NUMBER, "2");
  270. // はいらない。ファクトリ生成部分を以下のようにかけるから
  271. // TransformerFactory tf = TransformerFactory.newInstance();
  272. // こっちのほうがいいね。
  273. // ここを参照 http://www.mclnet.co.jp/tech/java/xml/pretty.html
  274. StringWriter writer = new StringWriter();// <-ここでは文字列として出力している
  275. StreamResult result = new StreamResult(writer);
  276. DOMSource source = new DOMSource(document);
  277. transformer.transform(source, result);
  278. System.out.println(writer.toString());
  279. // <<<<< DOMをStringに変換するおきまりのコード
  280. 実行結果
  281. <?xml version="1.0" encoding="UTF-8" standalone="no"?>
  282. <test>
  283. <message>こんにちは Java XML プログラミング</message>
  284. </test>
  285. __
  286. XMLファイルの出力[DOMImplementation]
  287. データベースから情報を読み込んで、XMLファイルを出力するサンプルです。
  288. 下記の例はファイルに出力していますが、サーブレットでWEBに出力する場合は、
  289. response.getOutputStream() で出力ストリームを出力し、StreamResult に渡します。
  290. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  291. DocumentBuilder builder = factory.newDocumentBuilder();
  292. DOMImplementation domImpl=builder.getDOMImplementation();
  293. Document document = domImpl.createDocument("","店舗情報",null);
  294. Element root = document.getDocumentElement();
  295. String sql = "select * from 会員情報";
  296. Statement state = con.createStatement();
  297. ResultSet res = state.executeQuery(sql);
  298. while (res.next()) {
  299. Element kaiin = document.createElement("会員情報");
  300. int kno = res.getInt("番号");
  301. String name = res.getString("氏名");
  302. String tel = res.getString("電話番号");
  303. Timestamp time = res.getTimestamp("登録日時");
  304. Element noNode = document.createElement("会員番号");
  305. Element nameNode = document.createElement("氏名");
  306. Element telNode = document.createElement("電話番号");
  307. Element timeNode = document.createElement("登録日時");
  308. noNode.appendChild(document.createTextNode(""+kno));
  309. nameNode.appendChild(document.createTextNode(name));
  310. telNode.appendChild(document.createTextNode(tel));
  311. timeNode.appendChild(document.createTextNode(time.toString()));
  312. kaiin.appendChild(noNode);
  313. kaiin.appendChild(nameNode);
  314. kaiin.appendChild(telNode);
  315. kaiin.appendChild(timeNode);
  316. root.appendChild(kaiin);
  317. }
  318. //出力
  319. TransformerFactory transFactory = TransformerFactory.newInstance();
  320. Transformer transformer = transFactory.newTransformer();
  321. DOMSource source = new DOMSource(document);
  322. File newXML = new File("newXML.xml");
  323. FileOutputStream os = new FileOutputStream(newXML);
  324. StreamResult result = new StreamResult(os);
  325. transformer.transform(source, result);
  326. 出力結果は以下のようになります。
  327. <?xml version="1.0" encoding="UTF-8"?>
  328. <店舗情報>
  329. <会員情報>
  330. <会員番号>1</会員番号>
  331. <氏名>山田太郎</氏名>
  332. <電話番号>090-1111-2222</電話番号>
  333. <登録日時>2007-12-11 14:51:22.102</登録日時>
  334. </会員情報>
  335. <会員情報>
  336. <会員番号>2</会員番号>
  337. <氏名>鈴木花子</氏名>
  338. <電話番号>090-1111-3333</電話番号>
  339. <登録日時>2007-12-11 14:51:38.678</登録日時>
  340. </会員情報>
  341. </店舗情報>
ダウンロード 印刷用表示

このコピペの URL

JavaScript での埋め込み

iframe での埋め込み

元のテキスト