import java.io.*; import java.net.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.w3c.dom.*; // XML DOM Tree を表示するプログラム // 使い方: java TreeViewer url [encoding] // (encoding は指定しないと utf-8) // // URL例: // RSS ver.1.0: http://www.kanzaki.com/info/memo.rdf // http://manabekawori.cocolog-nifty.com/blog/index.rdf // RSS ver.2.0: http://blogmag.ascii.jp/kodera/index.xml class DocumentTree { private URL url; private String encoding; private Document document; private int depth; public DocumentTree() { url = null; encoding = "utf-8"; document = null; depth = 0; } public void setURL(String url) { try { this.url = new URL(url); } catch(IOException e) { System.err.println("間違ったURL: " + url); } } public void setEncoding(String encoding) { this.encoding = encoding; } /** URLで指示されたフィードを取得し DOM tree を構築 */ public void connect() { BufferedReader in = null; try { // まずは接続し、データを読む Reader を生成 URLConnection connection = url.openConnection(); connection.connect(); InputStream inputStream = connection.getInputStream(); InputStreamReader reader = new InputStreamReader(inputStream, encoding); in = new BufferedReader(reader); } catch (IOException e) { System.err.println("接続エラー: " + e); System.exit(1); } try { // Reader を使ってストリームを読み、それを解析して Document を生成 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); document = builder.parse(new InputSource(in)); } catch (ParserConfigurationException e) { System.err.println("DocumentBuilderFactory生成エラー:" + e); } catch (SAXException e) { System.err.println("構文エラー:" + e); } catch (IOException e) { System.err.println("入出力エラー:" + e); } try { in.close(); } catch (IOException e) { System.err.println("接続終了エラー: " + e); } } /** DOM Tree の内容を表示 */ public void show() { try { // root要素を得る Element rootElement = document.getDocumentElement(); String rootElementName = rootElement.getNodeName(); System.out.println("root element: " + rootElementName); showTree(rootElement); } catch (DOMException e) { System.err.println("DOMエラー:" + e); } } /** node 以下の tree を表示 */ private void showTree(Node node) { for(Node current = node.getFirstChild(); current != null; current = current.getNextSibling()) { if(current.getNodeType() == Node.ELEMENT_NODE) { // ノードは要素? String nodeName = current.getNodeName(); System.out.println(indent() + nodeName + " {"); depth++; showTree(current); // さらに子ノードを見る (再帰) depth--; System.out.println(indent() + "}"); } else if(current.getNodeType() == Node.TEXT_NODE // ノードはテキスト? && current.getNodeValue().trim().length() != 0) System.out.println(indent() + current.getNodeValue()); else if(current.getNodeType() == Node.CDATA_SECTION_NODE) // ノードはCDATA? System.out.println(indent() + current.getNodeValue()); // HTMLタグなどを含む else ; // 上記以外のノードでは何もしない } } private String indent() { String indent = ""; for(int i = 0; i < depth; i++) indent += " "; return indent; } } class TreeViewer { public static void main(String args[]) { DocumentTree tree = new DocumentTree(); tree.setURL(args[0]); if(args.length > 1) // 引数で指示があったら文字コードを指定 tree.setEncoding(args[1]); tree.connect(); tree.show(); } }