「Java」XML 操作してみた(SAX)
Java で XML の操作してみたので、その時のメモ。
前回は 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 ファイルでやった方がわかりやすかったですね・・・
以上です。