import java.io.*; import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.xml.parsers.*; public class InputSourceEncodingTest { public static void main(String[] args) { InputSourceEncodingTest t = new InputSourceEncodingTest(); try { t.parse(args[0], args[1]); } catch(Exception e) { e.printStackTrace(); } } public void parse(String mode, String name) throws Exception { SAXParserFactory factory = SAXParserFactory.newInstance(); tryToGetSAXParserName(factory); SAXParser parser = factory.newSAXParser(); SAXHandler handler = new SAXHandler(); InputSource source = null; // モードによってInputSourceの作成方法を変えます。 if ("s".equals(mode)) { source = new InputSource(new FileInputStream(new File(name))); } else if ("r".equals(mode)) { source = new InputSource(new FileReader(new File(name))); } else if ("i".equals(mode)) { source = new InputSource("file:" + new File(name).getAbsolutePath()); } // 同じInputSourceを使って3回パースを試みます。 parser.parse(source, handler); parser.parse(source, handler); parser.parse(source, handler); } /** * 今使っているパーサが何なのかを調べます。 */ public void tryToGetSAXParserName(SAXParserFactory factory) { try { if (Class.forName("org.apache.crimson.jaxp.SAXParserFactoryImpl").isInstance(factory)) { System.out.println("parser: crimson"); } else if (Class.forName("org.apache.xerces.jaxp.SAXParserFactoryImpl").isInstance(factory)) { System.out.println("parser: xerces"); } else { System.out.println("parser: unknown"); } } catch (Exception e) { System.out.println("parser: unknown"); } } /** * characterだけ表示するSAXハンドラです。 */ public class SAXHandler extends DefaultHandler { private StringBuffer buf = new StringBuffer(); public void characters(char[] ch, int start, int length) throws SAXException { System.out.println(new String(ch, start, length)); } } }