SAXを使用して特定の形式のXMLをCSVファイルに変換

3414 ワード

ダイレクトコード
package org.autumn.kettle;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Date;

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

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

public class LearnSAX {

	public static void main(String[] args) throws Exception, SAXException {
		SAXParserFactory factory = SAXParserFactory.newInstance();
		SAXParser parser = factory.newSAXParser();
		Date before = new Date();
		parser.parse(new File("D:/hotel.xml"), new MyHandler());
		Date after = new Date();
		System.out.println("it takes " + (after.getTime() - before.getTime())
				+ "ms");
	}

}

class MyHandler extends DefaultHandler {

	OutputStreamWriter out = null;

	@Override
	public void startDocument() throws SAXException {
		try {
			out = new OutputStreamWriter(
					new FileOutputStream("D:/xml2csv.csv"), "GBK");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void endDocument() throws SAXException {
		try {
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		if (qName.equalsIgnoreCase("row")) {
			try {
				out.write("\r
"); } catch (IOException e) { e.printStackTrace(); } } } @Override public void characters(char ch[], int start, int length) throws SAXException { String s = new String(ch, start, length); if (!s.trim().isEmpty()) try { out.write(s + ","); } catch (IOException e) { e.printStackTrace(); } } }

入力されたXMLドキュメント:
<?xml version="1.0" encoding="UTF-8"?>
<Rows>
 <Row><domain>YJ</domain> <hotelname>         </hotelname> <hotelno>230016</hotelno> <lxr>   </lxr> <tel>23238687</tel> <address>         0 </address> <ssq>2</ssq> <bz/> </Row>
 <Row><domain>QY</domain> <hotelname>        </hotelname> <hotelno>443171</hotelno> <lxr>   </lxr> <tel>21289491</tel> <address>        49 </address> <ssq>3</ssq> <bz/> </Row>
</Rows>

出力されたCSVファイル:
YJ,         ,230016,   ,23238687,         0 ,2,
QY,        ,443171,   ,21289491,        49 ,3,