「Java」XML 操作してみた(SAX)

JavaXML の操作してみたので、その時のメモ。
前回は DOM を使いましたが、今回は SAX でやってみました。

ドキュメントは以下になります。

・Lesson: Simple API for XML (The Java"! Tutorials > Java API for XML Processing (JAXP))
http://docs.oracle.com/javase/tutorial/jaxp/sax/

※ サンプルコードは以下あたりにありますね。

・Parsing an XML File Using SAX (The Java"! Tutorials > Java API for XML Processing (JAXP) > Simple API for XML)
http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html

以下の Web ページも参考にさせていただきました。

Javaで実現するDOM/SAXプログラミング(4):SAXによるシンプルなXML文書の操作 (1/3) - @IT
http://www.atmarkit.co.jp/ait/articles/0105/18/news003.html


操作対象の XML ファイルは以下の内容としました。

■ input.xml

<?xml version="1.0" encoding="UTF-8"?>
<node attr1="0001" xmlns:aaa="http://www.example.com/aaa">
  <aaa:node1>
    <node11>hoge</node11>
    <node12>uga</node12>
  </aaa:node1>
  <node2>oro</node2>
  <node3>ahe</node3>
</node>

※ 後述の qName と localName で取得できる値の違いを明確にするため、適当な XML 名前空間を使用してます ( こんなことして OK なのかは知りません・・・ )。

■ XMLSAXTest.java

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

public class XMLSAXTest {
	public static void main(String[] args) {
		try {
			SAXParserFactory spf = SAXParserFactory.newInstance();
			spf.setNamespaceAware(true);
			SAXParser saxParser = spf.newSAXParser();
			XMLReader xmlReader = saxParser.getXMLReader();
			xmlReader.setContentHandler(new SAXLocalNameCount());
			xmlReader.parse("file:/C:/workspace42_64/XMLTest/input.xml");

		} catch (SAXException e) {
			e.printStackTrace();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

※ ファイルの指定はオラクルのチュートリアルにある convertToFileURL メソッドの方がよさそうかと思いますが、今回はハードコードで。

■SAXLocalNameCount.java ( DefaultHandler の拡張クラス )

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAXLocalNameCount extends DefaultHandler {

	public void startDocument() throws SAXException {
		System.out.println("*** startDocument ***");
	}

	public void endDocument() throws SAXException {
		System.out.println("*** endDocument ***");
	}

	public void startElement(String namespaceURI, String localName,
			String qName, Attributes atts) {

		System.out.println("startElement(qName): " + qName);
		System.out.println("startElement(localName): " + localName);
		System.out.println("startElement(atts): " + atts.getQName(0));
		System.out.println("startElement(atts): " + atts.getValue(0));
	}

	public void endElement(String namespaceURI, String localName, String qName) {

		System.out.println("endElement(qName): " + qName);
		System.out.println("endElement(localName): " + localName);
	}

	public void characters(char[] ch, int start, int length) {
		System.out.print("characters: ");
		for (int i = 0; i < length; i++) {
			System.out.print(ch[start + i]);
		}
		System.out.println();
	}
}

■ 出力結果

*** startDocument ***
startElement(qName): node
startElement(localName): node
startElement(atts): attr1
startElement(atts): 0001
characters: 
  
startElement(qName): aaa:node1
startElement(localName): node1
startElement(atts): null
startElement(atts): null
characters: 
    
startElement(qName): node11
startElement(localName): node11
startElement(atts): null
startElement(atts): null
characters: hoge
endElement(qName): node11
endElement(localName): node11
characters: 
    
startElement(qName): node12
startElement(localName): node12
startElement(atts): null
startElement(atts): null
characters: uga
endElement(qName): node12
endElement(localName): node12
characters: 
  
endElement(qName): aaa:node1
endElement(localName): node1
characters: 
  
startElement(qName): node2
startElement(localName): node2
startElement(atts): null
startElement(atts): null
characters: oro
endElement(qName): node2
endElement(localName): node2
characters: 
  
startElement(qName): node3
startElement(localName): node3
startElement(atts): null
startElement(atts): null
characters: ahe
endElement(qName): node3
endElement(localName): node3
characters: 

endElement(qName): node
endElement(localName): node
*** endDocument ***

※ もっとシンプルな内容の XML ファイルでやった方がわかりやすかったですね・・・


以上です。