/******************************************************************** * Une simple démo du XML DOM parser * This is freeware * * Made by Daniel.Schneider@tecfa.unige.ch * Just adapted from the XMLWriter example in the Xerces distribution * *********************************************************************/ import java.io.*; import org.apache.xerces.parsers.DOMParser; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.DocumentType; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; // vodoo ? import org.apache.xerces.dom.NodeImpl; import org.xml.sax.*; import org.xml.sax.helpers.*; import javax.servlet.*; import javax.servlet.http.*; public class DomTreeWriteServlet extends HttpServlet { // global variable for the PrintWriter PrintWriter out; String xmlURL; Document doc; protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { setPrintWriter (res.getWriter()); res.setContentType("text/html"); out.print(""); out.print("
"); try { // create a handler DOMParser parser = new DOMParser(); // DO IT parser.parse(xmlURL); doc = parser.getDocument(); // Element root = doc.getDocumentElement(); printElements(doc); printTail(); } catch (SAXParseException e) { out.println("The File is not well formed."); out.println(e.getMessage() + " at line " + e.getLineNumber() + ", column " + e.getColumnNumber()); } catch (SAXException e) { out.println("SAX exception found"); out.println(e.getMessage()); e.printStackTrace(out); printTail(); } catch (IOException e) { out.println("Beurk: IOException " + e); } catch (Exception e) { out.println("Other exception found:\n" + e); e.printStackTrace(out); } } } public void printElements(Node node) { if ( node == null ) { return; } // Let's see what kind of node we get int type = node.getNodeType(); switch ( type ) { // print document case Node.DOCUMENT_NODE: { out.println(""); out.println(""); out.println(""); out.flush(); out.close(); } public void setPrintWriter(PrintWriter pw) // important, else the other methods can't access out (I think) { out = pw; } }Found document node
"); // TO DO: let the user choose if he wants just the contents // printElements(((Document)node).getDocumentElement()); doAttrsAndKids(node); break; } case Node.DOCUMENT_TYPE_NODE: { out.println("Found document type node:"); out.print(" NodeName="); out.println(node.getNodeName()); out.print(" Name="); out.println(((DocumentType)node).getName()); doAttrsAndKids(node); out.print(" SystemId="); out.println(((DocumentType)node).getSystemId()); out.println("\n\n"); break; } // print element with attributes case Node.ELEMENT_NODE: { out.print("<"); // out.print('<'); out.print(node.getNodeName()); Attr attrs[] = sortAttributes(node.getAttributes()); for ( int i = 0; i < attrs.length; i++ ) { Attr attr = attrs[i]; out.print(' '); out.print(attr.getNodeName()); out.print("=\""); out.print(normalize(attr.getNodeValue())); out.print('"'); } //out.print('>'); out.print(">"); NodeList children = node.getChildNodes(); if ( children != null ) { int len = children.getLength(); for ( int i = 0; i < len; i++ ) { printElements(children.item(i)); } } break; } // handle entity reference nodes case Node.ENTITY_REFERENCE_NODE: { out.print('&'); out.print(node.getNodeName()); out.print(';'); break; } // print cdata sections case Node.CDATA_SECTION_NODE: { out.print(""); break; } // print text case Node.TEXT_NODE: { out.print(normalize(node.getNodeValue())); break; } // print processing instruction case Node.PROCESSING_INSTRUCTION_NODE: { out.print(""); out.print(node.getNodeName()); String data = node.getNodeValue(); if ( data != null && data.length() > 0 ) { out.print(' '); out.print(data); } out.print("?>"); break; } default: { out.println("Found strange node:"); out.print("NodeName="); out.print(node.getNodeName()); out.print("
"); break; } } if ( type == Node.ELEMENT_NODE ) { //out.print(""); out.print("<"); out.print(node.getNodeName()); // out.print('>'); out.print(">"); } // out.flush(); } // printElements(Node) void doAttrsAndKids (Node node) { try { // Attributes Attr attrs[] = sortAttributes(node.getAttributes()); for ( int i = 0; i < attrs.length; i++ ) { Attr attr = attrs[i]; out.print(' '); out.print(attr.getNodeName()); out.print("=\""); out.print(normalize(attr.getNodeValue())); out.print('"'); } // Children NodeList children = node.getChildNodes(); if ( children != null ) { int len = children.getLength(); for ( int i = 0; i < len; i++ ) { printElements(children.item(i)); } } } catch (Exception e) { out.println("
Value="); out.print(node.getNodeValue()); out.println(""); out.println(e.getMessage()); e.printStackTrace(out); out.println(""); printTail(); } } protected Attr[] sortAttributes(NamedNodeMap attrs) { int len = (attrs != null) ? attrs.getLength() : 0; Attr array[] = new Attr[len]; for ( int i = 0; i < len; i++ ) { array[i] = (Attr)attrs.item(i); } for ( int i = 0; i < len - 1; i++ ) { String name = array[i].getNodeName(); int index = i; for ( int j = i + 1; j < len; j++ ) { String curName = array[j].getNodeName(); if ( curName.compareTo(name) < 0 ) { name = curName; index = j; } } if ( index != i ) { Attr temp = array[i]; array[i] = array[index]; array[index] = temp; } } return (array); } // sortAttributes(NamedNodeMap):Attr[] /** Normalizes the given string. */ protected String normalize(String s) { StringBuffer str = new StringBuffer(); int len = (s != null) ? s.length() : 0; for ( int i = 0; i < len; i++ ) { char ch = s.charAt(i); switch ( ch ) { case '<': { str.append("<"); break; } case '>': { str.append(">"); break; } case '&': { str.append("&"); break; } case '"': { str.append("""); break; } case '\r': default: { str.append(ch); } } } return (str.toString()); } // normalize(String):String public void printTail () { out.println("