else if (p instanceof org.w3c.dom.CharacterData)
else if (p.getNodeType() == Node.TEXT_NODE)
	public void doNode(Node p) {		if (p instanceof com.sun.xml.tree.XmlDocument)			return;	// nothing to do - structural object.		// else if (p instanceof com.sun.xml.tree.Doctype)		//	return;	// ditto		else if (p instanceof Element)			doElement((Element)p);		else if (p instanceof org.w3c.dom.CharacterData)			doCData((org.w3c.dom.CharacterData)p);		else			System.err.println("IGNORING non-Element: " +				p.getClass() + : + p.toString() + "\n" +				p.getNodeValue());	}	protected void doElement(Element p) {		String tag = p.getTagName().toLowerCase();		if (tag.equals("ch")) {			doChapter(p);		} else if (tag.equals("sc")) {			doSection(p);		} else if (tag.equals("ss")) {			doSubSection(p);		} else if (tag.equals("p")) {			doParagraph(p);		} else if (tag.equals("pr")) {			msg.println("<HeadB>Problem");		} else if (tag.equals("so")) {			msg.println("<HeadB>Solution");		} else if (tag.equals("di")) {			msg.println("<HeadB>Discussion");		} else if (tag.equals("code")) {			doCode(p);		} else if (tag.equals("b")) {			doBold(p);		} else if (tag.equals("i")) {			doItalic(p);		} else if (tag.equals("example")) {			doExample(p);		} else			System.err.println("IGNORING UNHANDLED TAG " + tag + ( +				p.getClass() + @ + p.hashCode() + ));	}	protected void doChapter(Element p) {		msg.println("<ChapterTitle>");	}	protected void doSection(Element p) {		msg.println("<HeadA>");	}	protected void doSubSection(Element p) {		msg.println("<HeadB>");	}	protected void doParagraph(Element p) {		msg.println("<Body>");	}	protected void doExample(Element p) {		NamedNodeMap attrs = p.getAttributes();		Node href;		if ((href = attrs.getNamedItem("HREF")) == null)			throw new IllegalArgumentException(				"node " + p + "lacks required HREF Attribute");		String fname = href.getNodeValue();		msg.println("<Example>");		try {			fname = "/javasrc/" + fname;			LineNumberReader is = new LineNumberReader(new FileReader(fname));			gm.process(fname, is, smsg);		} catch(IOException e) {			throw new IllegalArgumentException(e.toString());		}	}	protected void doCData(org.w3c.dom.CharacterData p) {		String s = p.getData().trim();		if (s.length() == 0)	// Suns parser returns extra 1-space "Text"s			return;		msg.println(s);	}	protected void doBold(Element p) {		msg.print("<Bold>");		doNodes(p);		msg.print("<Plain>");	}	protected void doItalic(Element p) {		msg.print("<Italic>");		doNodes(p);		msg.print("<Plain>");	}	protected void doNodes(Element p) {		NodeList nodes = p.getChildNodes();		for (int i=0; i<nodes.getLength(); i++) {			Node n = nodes.item(i);			if (n instanceof CharacterData) {				doCData((CharacterData)n);				p.removeChild(n);			}		}