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;
}
}
-_-_-