import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import java.io.*; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class DOMViewer { public static void main(String[] args) throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); if (args.length > 0) { new GDom(builder, args[0]); } else { new TDom(builder); } } static Node load(String filename, DocumentBuilder builder) { Node dom = null; try { new FileReader(filename); } catch (java.io.IOException ioe) { System.out.println("--- Error --- Couldn't find/open file: " + filename); } try { dom = builder.parse(new File(filename).toURL().toString()); } catch (Exception pe) { System.out.println("--- Error --- Failed parsing file: " + filename); } return dom; } static String toString(Node dom) { return toString(dom.getFirstChild(), ""); } static String toString(Node node, String indent) { String s = ""; if (node != null) { switch (node.getNodeType()) { case Node.TEXT_NODE: String txt = node.getNodeValue().trim(); if (!txt.equals("")) { s += (indent + txt + "\n"); } break; case Node.COMMENT_NODE: s += (indent + "\n"); break; case Node.CDATA_SECTION_NODE: s += (indent + "\n"); break; case Node.PROCESSING_INSTRUCTION_NODE: s += (indent + "\n"); break; case Node.ELEMENT_NODE: s += (indent + "<" + node.getNodeName()); if (node.hasAttributes()) { NamedNodeMap attributes = node.getAttributes(); for (int i = 0; i < attributes.getLength(); i++) { Node attr = attributes.item(i); s += (" " + attr.getNodeName() + "=\"" + attr.getNodeValue() + "\""); } } s += ">\n"; s += toString(node.getFirstChild(), indent + " "); s += (indent + "\n"); break; default: String v = node.getNodeValue(); if (v != null) { v = v.trim(); } System.out.println("Type not suppoerted: " + typeName(node.getNodeType()) + " name=\"" + node.getNodeName() + "\" value=\"" + v + "\""); s += toString(node.getFirstChild(), indent + " "); } s += toString(node.getNextSibling(), indent); } return s; } static String typeName(int typeNum) { switch (typeNum) { case Node.CDATA_SECTION_NODE: return "CDATA_SECTION_NODE"; case Node.COMMENT_NODE: return "COMMENT_NODE"; case Node.ELEMENT_NODE: return "ELEMENT_NODE"; case Node.PROCESSING_INSTRUCTION_NODE: return "PROCESSING_INSTRUCTION_NODE"; case Node.TEXT_NODE: return "TEXT_NODE"; default: return "not considered"; } } static Node move(Node node, Node nd) { if (nd != null) { switch (node.getNodeType()) { case Node.ELEMENT_NODE: Element e = (Element) node; if (e.hasAttribute("cursor")) { e.removeAttribute("cursor"); } break; case Node.TEXT_NODE: case Node.COMMENT_NODE: case Node.PROCESSING_INSTRUCTION_NODE: case Node.CDATA_SECTION_NODE: node.setNodeValue(node.getNodeValue().replaceAll(" =========================", "")); break; default:} node = nd; switch (node.getNodeType()) { case Node.ELEMENT_NODE: ((Element) node).setAttribute("cursor", " ========================="); break; case Node.TEXT_NODE: case Node.COMMENT_NODE: case Node.PROCESSING_INSTRUCTION_NODE: case Node.CDATA_SECTION_NODE: node.setNodeValue(node.getNodeValue() + " ========================="); break; default:} } return node; } } class TDom { Node dom = null; Node curNode; TDom(DocumentBuilder builder) { boolean quit = false; while (!quit) { System.out.print("Please type a request (h for help): "); int request = 'h'; try { request = System.in.read(); } catch (java.io.IOException ioe) { System.out.print("\n--- Error --- Couldn't read request"); } System.out.println(); switch (request) { case 'q': quit = true; break; case 'h': System.out.print("Available options\n" + " q: quit\n" + " h: help\n" + " n: load a new xml file\n" + " p: print xml file\n" + " d: move cursor down\n" + " u: move cursor up\n" + " l: move cursor left\n" + " r: move cursor right\n"); break; case 'n': System.out.print("Please type a filename: "); String filename = ""; char ch = ' '; try { while (ch <= ' ') { ch = (char) System.in.read(); } while (ch > ' ') { filename += ch; ch = (char) System.in.read(); } } catch (java.io.IOException ioe) { System.out.println("--- Error --- Couldn't read filename"); } curNode = dom = DOMViewer.load(filename, builder); break; case 'p': String s = ""; s = (dom == null) ? "" : DOMViewer.toString(dom); System.out.println(s); break; case 'd': curNode = DOMViewer.move(curNode, curNode.getFirstChild()); break; case 'u': curNode = DOMViewer.move(curNode, curNode.getParentNode()); break; case 'l': curNode = DOMViewer.move(curNode, curNode.getPreviousSibling()); break; case 'r': curNode = DOMViewer.move(curNode, curNode.getNextSibling()); break; default: ; } } } }