<..DOMLab.java..>
 import java.io.*;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 
 public class DOMLab {
     static Node dom = null;
     static Node curNode;
 
     public static void main(String[] args) throws Exception {
         DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
         DocumentBuilder builder = factory.newDocumentBuilder();
         boolean quit = false;
 
         while (!quit) {
           System.out.print("Please type a request: ");
           int request = System.in.read();
           System.out.println();
           switch (request) {
             case ’q’: quit = true; break;
             case ’p’: print(); break;
             case ’d’:
                 curNode = move(curNode, curNode.getFirstChild());      break;
             case ’u’:
                 curNode = move(curNode, curNode.getParentNode());      break;
             case ’l’:
                 curNode = move(curNode, curNode.getPreviousSibling()); break;
             case ’r’:
                 curNode = move(curNode, curNode.getNextSibling());     break;
 
             case ’n’:
                 System.out.print("Please type a filename: ");
 
                 String filename = "";
                 char ch = ’ ’;
                 while (ch <= ’ ’) {
                     ch = (char) System.in.read();
                 }
                 while (ch > ’ ’) {
                     filename += ch;
                     ch = (char) System.in.read();
                 }
                 curNode = dom = null;
                 try {
                     new FileReader(filename);
                     curNode = dom = builder.parse(new File(filename).toURL()
                                                                     .toString());
                 } catch (java.io.IOException e) {
                     System.out.println(
                         "--- Error --- Couldn’t find/open file: " + filename);
                 }
                 break;
             default: ;
     }   } }
 
     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;
     }
 
     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 void print() {
         String s = toString(dom.getFirstChild(), "");
         System.out.println(s);
     }
     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 + "<!--" + node.getNodeValue().trim() + "-->\n");
                 break;
 
             case Node.CDATA_SECTION_NODE:
                 s += (indent + "<![CDATA[" + node.getNodeValue().trim() +
                 "]]>\n");
                 break;
 
             case Node.PROCESSING_INSTRUCTION_NODE:
                 s += (indent + "<?" + node.getNodeName() + " " +
                 node.getNodeValue() + "?>\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 + "</" + node.getNodeName() + ">\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;
     }
 }
-_-_-