sonnet.xml 这是在本教程中贯穿使用的示例 XML 文档。 <?xml version="1.0"?> <!DOCTYPE sonnet SYSTEM "sonnet.dtd"> <sonnet type="Shakespearean"> <author> <last-name>Shakespeare</last-name> <first-name>William</first-name> <nationality>British</nationality> <year-of-birth>1564</year-of-birth> <year-of-death>1616</year-of-death> </author> <title>Sonnet 130</title> <text> <line>My mistress` eyes are nothing like the sun,</line> <line>Coral is far more red than her lips red.</line> <line>If snow be white, why then her breasts are dun,</line> <line>If hairs be wires, black wires grow on her head.</line> <line>I have seen roses damasked, red and white,</line> <line>But no such roses see I in her cheeks.</line> <line>And in some perfumes is there more delight</line> <line>Than in the breath that from my mistress reeks.</line> <line>I love to hear her speak, yet well I know</line> <line>That music hath a far more pleasing sound.</line> <line>I grant I never saw a goddess go,</line> <line>My mistress when she walks, treads on the ground.</line> <line>And yet, by Heaven, I think my love as rare</line> <line>As any she belied with false compare.</line> </text> </sonnet> sonnet.dtd 这是我们示例文档所用的 DTD。 <!-- sonnet.dtd --> <!ELEMENT sonnet (author,title?,text) > <!ATTLIST sonnet type (Shakespearean | Petrarchan) "Shakespearean"> <!ELEMENT text (line,line,line,line, line,line,line,line, line,line,line,line, line,line) > <!ELEMENT author (last-name,first-name,nationality, year-of-birth?,year-of-death?) > <!ELEMENT title (<!ELEMENT last-name (<!ELEMENT first-name (<!ELEMENT nationality (<!ELEMENT year-of-birth (<!ELEMENT year-of-death (<!ELEMENT line ( domOne.java 这是我们的第一个 DOM 应用。它解析一个 XML 文档并将其内容输出到标准输出。 /* * (C) Copyright IBM Corp. 1999 All rights reserved. * * US Government Users Restricted Rights Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * * The program is provided "as is" without any warranty express or * implied, including the warranty of non-infringement and the implied * warranties of merchantibility and fitness for a particular purpose. * IBM will not be liable for any damages suffered by you as a result * of using the Program. In no event will IBM be liable for any * special, indirect or consequential damages or lost profits even if * IBM has been advised of the possibility of their occurrence. IBM * will not be liable for any third party claims against you. */ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import org.w3c.dom.Attr; import org.w3c.dom.Document; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.ibm.xml.parsers.*; /** * domOne.java * Illustrates how to go through a DOM tree. */ public class domOne { public void parseAndPrint(String uri) { Document doc = null; try { DOMParser parser = new DOMParser(); parser.parse(uri); doc = parser.getDocument(); } catch (Exception e) { System.err.println("Sorry, an error occurred: " + e); } // We`ve parsed the document now, so let`s print it. if (doc != null) printDOMTree(doc); } /** Prints the specified node, then prints all of its children. */ public void printDOMTree(Node node) { int type = node.getNodeType(); switch (type) { // print the document element case Node.DOCUMENT_NODE: { System.out.println("<?xml version="1.0" ?>"); printDOMTree(((Document)node).getDocumentElement()); break; } // print element with attributes case Node.ELEMENT_NODE: { System.out.print("<"); System.out.print(node.getNodeName()); NamedNodeMap attrs = node.getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Node attr = attrs.item(i); System.out.print(" " + attr.getNodeName() + "="" + attr.getNodeValue() + """); } System.out.println(">"); NodeList children = node.getChildNodes(); if (children != null) { int len = children.getLength(); for (int i = 0; i < len; i++) printDOMTree(children.item(i)); } break; } // handle entity reference nodes case Node.ENTITY_REFERENCE_NODE: { System.out.print("&"); System.out.print(node.getNodeName()); System.out.print(";"); break; } // print cdata sections case Node.CDATA_SECTION_NODE: { System.out.print("<![CDATA["); System.out.print(node.getNodeValue()); System.out.print("]]>"); break; } // print text case Node.TEXT_NODE: { System.out.print(node.getNodeValue()); break; } // print processing instruction case Node.PROCESSING_INSTRUCTION_NODE: { System.out.print("<?"); System.out.print(node.getNodeName()); String data = node.getNodeValue(); { System.out.print(" "); System.out.print(data); } System.out.print("?>"); break; } } if (type == Node.ELEMENT_NODE) { System.out.println(); System.out.print("</"); System.out.print(node.getNodeName()); System.out.print(`>`); } } /** Main program entry point. */ public static void main(String argv[]) { if (argv.length == 0) { System.out.println("Usage: java domOne uri"); System.out.println(" where uri is the URI of the XML document you want to print."); System.out.println(" Sample: java domOne sonnet.xml"); System.exit(1); } domOne d1 = new domOne(); d1.parseAndPrint(argv[0]); } } domCounter.java 这段代码解析一个 XML 文档,然后遍历 DOM 树来采集有关该文档的数据。当数据采集后将其输出到标准输出。 /* * (C) Copyright IBM Corp. 1999 All rights reserved. * * US Government Users Restricted Rights Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * * The program is provided "as is" without any warranty express or * implied, including the warranty of non-infringement and the implied * warranties of merchantibility and fitness for a particular purpose. * IBM will not be liable for any damages suffered by you as a result * of using the Program. In no event will IBM be liable for any * special, indirect or consequential damages or lost profits even if * IBM has been advised of the possibility of their occurrence. IBM * will not be liable for any third party claims against you. */ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.ibm.xml.parsers.DOMParser; /** * domCounter.java * This code creates a DOM parser, parses a document, then * prints statistics about the number and type of nodes * found in the document. */ public class domCounter { int documentNodes = 0; int elementNodes = 0; int entityReferenceNodes = 0; int cdataSections = 0; int textNodes = 0; int processingInstructions = 0; public void parseAndCount(String uri) { Document doc = null; try { DOMParser parser = new DOMParser(); parser.parse(uri); doc = parser.getDocument(); } catch (Exception e) { System.err.println("Sorry, an error occurred: " + e); } // We`ve parsed the document now, so let`s scan the DOM tree and // print the statistics. if (doc != null) { scanDOMTree(doc); System.out.println("Document Statistics for " + uri + ":"); System.out.println("===================================="); System.out.println("Document Nodes: " + documentNodes); System.out.println("Element Nodes: " + elementNodes); System.out.println("Entity Reference Nodes: " + entityReferenceNodes); System.out.println("CDATA Sections: " + cdataSections); System.out.println("Text Nodes: " + textNodes); System.out.println("Processing Instructions: " + processingInstructions); System.out.println(" ----------"); int totalNodes = documentNodes + elementNodes + entityReferenceNodes + cdataSections + textNodes + processingInstructions; System.out.println("Total: " + totalNodes + " Nodes"); } } /** Scans the DOM tree and counts the different types of nodes. */ public void scanDOMTree(Node node) { int type = node.getNodeType(); switch (type) { case Node.DOCUMENT_NODE: documentNodes++; scanDOMTree(((Document)node).getDocumentElement()); break; case Node.ELEMENT_NODE: elementNodes++; NodeList children = node.getChildNodes(); if (children != null) { int len = children.getLength(); for (int i = 0; i < len; i++) scanDOMTree(children.item(i)); } break; case Node.ENTITY_REFERENCE_NODE: entityReferenceNodes++; break; case Node.CDATA_SECTION_NODE: cdataSections++; break; case Node.TEXT_NODE: textNodes++; break; case Node.PROCESSING_INSTRUCTION_NODE: processingInstructions++; break; } } /** Main program entry point. */ public static void main(String argv[]) { if (argv.length == 0) { System.out.println("Usage: java domCounter uri"); System.out.println(" where uri is the URI of your XML document."); System.out.println(" Sample: java domCounter sonnet.xml"); System.exit(1); } domCounter dc = new domCounter(); dc.parseAndCount(argv[0]); } } saxOne.java /* * (C) Copyright IBM Corp. 1999 All rights reserved. * * US Government Users Restricted Rights Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * * The program is provided "as is" without any warranty express or * implied, including the warranty of non-infringement and the implied * warranties of merchantibility and fitness for a particular purpose. * IBM will not be liable for any damages suffered by you as a result * of using the Program. In no event will IBM be liable for any * special, indirect or consequential damages or lost profits even if * IBM has been advised of the possibility of their occurrence. IBM * will not be liable for any third party claims against you. */ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import org.xml.sax.AttributeList; import org.xml.sax.HandlerBase; import org.xml.sax.Parser; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.ParserFactory; import com.ibm.xml.parsers.SAXParser; /** * saxOne.java * This sample program illustrates how to use a SAX parser. It * parses a document and writes the document? contents back to * standard output. */ public class saxOne extends HandlerBase { public void parseURI(String uri) { SAXParser parser = new SAXParser(); parser.setDocumentHandler(this); parser.setErrorHandler(this); try { parser.parse(uri); } catch (Exception e) { System.err.println(e); } } /** Processing instruction. */ public void processingInstruction(String target, String data) { System.out.print("<?"); System.out.print(target); if (data != null && data.length() > 0) { System.out.print(` `); System.out.print(data); } System.out.print("?>"); } /** Start document. */ public void startDocument() { System.out.println("<?xml version="1.0"?>"); } /** Start element. */ public void startElement(String name, AttributeList attrs) { System.out.print("<"); System.out.print(name); if (attrs != null) { int len = attrs.getLength(); for (int i = 0; i < len; i++) { System.out.print(" "); System.out.print(attrs.getName(i)); System.out.print("=""); System.out.print(attrs.getValue(i)); System.out.print("""); } } System.out.print(">"); } /** Characters. */ public void characters(char ch[], int start, int length) { System.out.print(new String(ch, start, length)); } /** Ignorable whitespace. */ public void ignorableWhitespace(char ch[], int start, int length) { characters(ch, start, length); } /** End element. */ public void endElement(String name) { System.out.print("</"); System.out.print(name); System.out.print(">"); } /** End document. */ public void endDocument() { // No need to do anything. } // // ErrorHandler methods // /** Warning. */ public void warning(SAXParseException ex) { System.err.println("[Warning] "+ getLocationString(ex)+": "+ ex.getMessage()); } /** Error. */ public void error(SAXParseException ex) { System.err.println("[Error] "+ getLocationString(ex)+": "+ ex.getMessage()); } /** Fatal error. */ public void fatalError(SAXParseException ex) throws SAXException { System.err.println("[Fatal Error] "+ getLocationString(ex)+": "+ ex.getMessage()); throw ex; } /** Returns a string of the location. */ private String getLocationString(SAXParseException ex) { StringBuffer str = new StringBuffer(); String systemId = ex.getSystemId(); if (systemId != null) { int index = systemId.lastIndexOf(`/`); if (index != -1) systemId = systemId.substring(index + 1); str.append(systemId); } str.append(`:`); str.append(ex.getLineNumber()); str.append(`:`); str.append(ex.getColumnNumber()); return str.toString(); } /** Main program entry point. */ public static void main(String argv[]) { if (argv.length == 0) { System.out.println("Usage: java saxOne uri"); System.out.println(" where uri is the URI of your XML document."); System.out.println(" Sample: java saxOne sonnet.xml"); System.exit(1); } saxOne s1 = new saxOne(); s1.parseURI(argv[0]); } } saxCounter.java /* * (C) Copyright IBM Corp. 1999 All rights reserved. * * US Government Users Restricted Rights Use, duplication or * disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * * The program is provided "as is" without any warranty express or * implied, including the warranty of non-infringement and the implied * warranties of merchantibility and fitness for a particular purpose. * IBM will not be liable for any damages suffered by you as a result * of using the Program. In no event will IBM be liable for any * special, indirect or consequential damages or lost profits even if * IBM has been advised of the possibility of their occurrence. IBM * will not be liable for any third party claims against you. */ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import org.xml.sax.AttributeList; import org.xml.sax.HandlerBase; import org.xml.sax.Parser; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; import org.xml.sax.helpers.ParserFactory; import com.ibm.xml.parsers.SAXParser; /** * saxCounter.java * This sample program calculates statistics for an XML document, * based on the SAX events received. When the parse is complete, * it prints the statistics to standard output. */ public class saxCounter extends HandlerBase { int startDocumentEvents = 0; int endDocumentEvents = 0; int startElementEvents = 0; int endElementEvents = 0; int processingInstructionEvents = 0; int characterEvents = 0; int ignorableWhitespaceEvents = 0; int warningEvents = 0; int errorEvents = 0; int fatalErrorEvents = 0; public void parseURI(String uri) { SAXParser parser = new SAXParser(); parser.setDocumentHandler(this); parser.setErrorHandler(this); try { parser.parse(uri); } catch (Exception e) { System.err.println(e); } System.out.println("Document Statistics for " + uri + ":"); System.out.println("===================================="); System.out.println("DocumentHandler Events:"); System.out.println(" startDocument " + startDocumentEvents); System.out.println(" endDocument " + endDocumentEvents); System.out.println(" startElement " + startElementEvents); System.out.println(" endElement " + endElementEvents); System.out.println(" processingInstruction " + processingInstructionEvents); System.out.println(" character " + characterEvents); System.out.println(" ignorableWhitespace " + ignorableWhitespaceEvents); System.out.println("ErrorHandler Events:"); System.out.println(" warning " + warningEvents); System.out.println(" error " + errorEvents); System.out.println(" fatalError " + fatalErrorEvents); System.out.println(" ----------"); int totalEvents = startDocumentEvents + endDocumentEvents + startElementEvents + endElementEvents + processingInstructionEvents + characterEvents + ignorableWhitespaceEvents + warningEvents + errorEvents + fatalErrorEvents; System.out.println("Total: " + totalEvents + " Events"); } /** Processing instruction. */ public void processingInstruction(String target, String data) { processingInstructionEvents++; } /** Start document. */ public void startDocument() { startDocumentEvents++; } /** Start element. */ public void startElement(String name, AttributeList attrs) { startElementEvents++; } /** Characters. */ public void characters(char ch[], int start, int length) { characterEvents++; } /** Ignorable whitespace. */ public void ignorableWhitespace(char ch[], int start, int length) { ignorableWhitespaceEvents++; } /** End element. */ public void endElement(String name) { endElementEvents++; } /** End document. */ public void endDocument() { endDocumentEvents++; } // // ErrorHandler methods // /** Warning. */ public void warning(SAXParseException ex) { warningEvents++; } /** Error. */ public void error(SAXParseException ex) { errorEvents++; } /** Fatal error. */ public void fatalError(SAXParseException ex) throws SAXException { fatalErrorEvents++; throw ex; } /** Main program entry point. */ public static void main(String argv[]) { if (argv.length == 0) { System.out.println("Usage: java saxCounter uri"); System.out.println(" where uri is the URI of your XML document."); System.out.println(" Sample: java saxCounter sonnet.xml"); System.exit(1); } saxCounter sc = new saxCounter(); sc.parseURI(argv[0]); } }