感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

XML 要素を取り出す

スポンサーリンク

JavaでXMLファイルの要素を取り出して、新たなファイルに書きだしてみる。

他の本を読んでもわかりづらかったものが、やさしいXMLを読んだらだいぶ理解が進んだ。
さすがは高橋麻奈さんである。
初心者に優しい。ご本人もきっとお優しい人であるに違いない。

やさしいXML 第3版

やさしいXML 第3版

DOMのメソッド
■Documentインターフェース
[返り値の型]Element
[メソッド]createElement(String tagName)
[機能]文書の要素を作成する

[返り値の型]Text
[メソッド]createTextNode(String date)
[機能]文書のテキストを作成する


[返り値の型]NodeList
[メソッド]getElementsByTagName(String tagname)
[機能]文書からノードリスト(要素のリスト)を得る


■Nodeインターフェース
[返り値の型]Document
[メソッド]getOwnerDocument()
[機能]ノードの文書を得る

[返り値の型]Node
[メソッド]appendhild(Node newChild)
[機能]ノードに子を追加する

[返り値の型]int
[メソッド]getLength
[機能]ノードリストのノードの個数を得る

[返り値の型]Node
[メソッド]item(int index)
[機能]ノードリストからノードを得る

読み込むXMLファイルは以下の通り。

<?xml version="1.0" encoding="Shift_JIS"?>
<project>
	<dependencies>
	    <dependency>
	        <id>ant</id>
	        <version>1.5</version>
	    </dependency>
	
	    <dependency>
	        <id>junit</id>
	        <version>3.8.1</version>
	    </dependency>
	
	    <dependency>
	        <id>ejb</id>
	        <version>2.1</version>
	    </dependency>
	</dependencies>
</project>
package xml;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
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;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;

public class AddElementTest {
	public static void main(String[] args) throws Exception{
		getElement("xml\\hoge.xml");
	}
	
	private static void getElement(String xml) throws ParserConfigurationException, FileNotFoundException, SAXException, IOException, TransformerException {
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		//文書の読み込み
		Document parseDoc = db.parse(new FileInputStream(xml));
		
		//新しいXMLを作成する準備
		Document newDoc = db.newDocument();
		
		//ルート要素を追加する
		Element root = newDoc.createElement("project");
		newDoc.appendChild(root);
		
		//要素名を指定して要素を取り出す
		NodeList list = parseDoc.getElementsByTagName("id");
		
		for (int i = 0; i < list.getLength(); i++) {
			Node node = list.item(i);
			for(Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) {
				//新規作成した文書に追加する
				Element elm = newDoc.createElement("newId");
				Text text = newDoc.createTextNode(child.getNodeValue());
				elm.appendChild(text);
				System.out.println("id要素は・・・" + text.getTextContent());
				root.appendChild(elm);
			}
		}
		
		//文書を書き出す
		TransformerFactory tff = TransformerFactory.newInstance();
		Transformer tf = tff.newTransformer();
		tf.setOutputProperty(OutputKeys.ENCODING, "Shift_JIS");
		tf.transform(new DOMSource(newDoc), new StreamResult("new.xml"));
		
	}
}

書きだした新しいXMLファイル

<?xml version="1.0" encoding="Shift_JIS" standalone="no"?><project><newId>ant</newId><newId>junit</newId><newId>ejb</newId></project>

改行などができていなくて読みづらくなってしまった。
引き続きXMLの操作について学びたい。