SAXを使用して特定の形式のXMLをCSVファイルに変換
ダイレクトコード
入力されたXMLドキュメント:
出力されたCSVファイル:
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,