Processing XML in Java
An Introduction |
Prof. David Bernstein |
Computer Science Department |
bernstdh@jmu.edu |
import org.xml.sax.*; import org.xml.sax.helpers.*; /** * Handles accident-reports contained in an incidents file * * Note: This class both contains logic and performs I/O. It would * be better to use the Observer pattern. The current approach is used * for simplicity. * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class AccidentReportHandler extends DefaultHandler { /** * Receive notification of the start of an element * * @param uri The namespace URI * @param localName The local name or the empty string (if no namespace) * @param qName The qualified name (with prefix) * @param attributes The specified or default attributes */ public void startElement(String uri, String localName, String qName, Attributes attributes) { String size, type; if (qName.equals("accident-report")) { size = attributes.getValue("size"); type = attributes.getValue("type"); System.out.println("\n\nAccident Report: "); System.out.println(" Description: " + type); System.out.println(" No. of vehicles: " + size); } } }
import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; /** * Displays accident-reports contained in an incidents file * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class AccidentReporter { /** * The entry-point of the application * * @param args The command line arguments */ public static void main(String[] args) throws Exception { AccidentReportHandler handler; File incidents; SAXParser parser; SAXParserFactory factory; incidents = new File("incidents.xml"); factory = SAXParserFactory.newInstance(); parser = factory.newSAXParser(); handler = new AccidentReportHandler(); parser.parse(incidents, handler); } }
import org.xml.sax.*; import org.xml.sax.helpers.*; /** * Finds a particular departure-time in a timetable * * Note: This implementation assumes that the station * preceeds the time in the stop. * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class DepartureTimeFinder extends DefaultHandler { private String characters, dt, station, targetTrain, targetStation; private String time, waitingFor; /** * Explicit value Constructor * * @param targetTrain The train of interest (e.g., "191") * @param targetStation The station of interest (e.g., "Newark, NJ") */ public DepartureTimeFinder(String targetTrain, String targetStation) { this.targetTrain = targetTrain; this.targetStation = targetStation; time = null; } /** * Return the departure time (or null if the train and station were * not found) * * @return The departure time */ public String getDepartureTime() { return time; } /** * Receive notification of the beginning of the document * */ public void startDocument() { waitingFor = "train"; } /** * Receive notification of the start of an element * * @param uri The namespace URI * @param localName The local name or the empty string (if no namespace) * @param qName The qualified name (with prefix) * @param attributes The specified or default attributes */ public void startElement(String uri, String localName, String qName, Attributes attributes) { String number; if (qName.equals(waitingFor)) { if (qName.equals("train")) { number = attributes.getValue("number"); if ((number != null) && (number.equals(targetTrain))) { waitingFor = "stop"; } } else if (qName.equals("stop")) { waitingFor = "station"; } else if (qName.equals("station")) { // Need the characters } } } /** * Receive notification of character data inside an element * * @param ch The characters * @param start The start position in the character array * @param length The number of characters to use from the character array */ public void characters(char[] ch, int start, int length) { if (waitingFor.equals("station")) { characters = new String(ch, start, length).trim(); } else if (waitingFor.equals("time")) { characters = new String(ch, start, length).trim(); } } /** * Receive notification of the start of an element * * @param uri The namespace URI * @param localName The local name or the empty string (if no namespace) * @param qName The qualified name (with prefix) */ public void endElement(String uri, String localName, String qName) { if (waitingFor.equals("station")) { if ((characters != null) && characters.equals(targetStation)) { waitingFor = "time"; } // Otherwise wait for another station } else if (waitingFor.equals("time")) { // This only happens when the train and station // have already been confirmed time = characters; waitingFor = ""; } } }
import java.io.*; import javax.xml.parsers.*; import org.xml.sax.*; import org.xml.sax.helpers.*; /** * Finds and displays departure-times of trains * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class DTFDriver { /** * The entry-point of the application * * @param args The command line arguments (train, station) */ public static void main(String[] args) throws Exception { DepartureTimeFinder finder; File amtrak; SAXParser parser; SAXParserFactory factory; String time; amtrak = new File("amtrak.xml"); factory = SAXParserFactory.newInstance(); parser = factory.newSAXParser(); finder = new DepartureTimeFinder(args[0], args[1]); parser.parse(amtrak, finder); time = finder.getDepartureTime(); if (time == null) System.out.println("Sorry!"); else System.out.println("Train "+args[0]+ " departs "+args[1]+ " at "+time); } }
import org.w3c.dom.*; import org.xml.sax.*; import java.io.*; import javax.xml.parsers.*; /** * Finds and displays departure-times of trains * * @version 1.0 * @author Prof. David Bernstein, James Madison University */ public class TimeTable { /** * The entry-point of the application * * @param args The command line arguments (train, station) */ public static void main(String[] args) throws Exception { boolean found; Document tree; DocumentBuilder builder; DocumentBuilderFactory factory; Element root, station, stop, time, train; File amtrak; int i, n; Node text; NodeList children, stations, stops, textNodes; NodeList times, trains; String departureTime, number, stationName; amtrak = new File("amtrak.xml"); factory = DocumentBuilderFactory.newInstance(); builder = factory.newDocumentBuilder(); tree = builder.parse(amtrak); // Get the timetable element root = tree.getDocumentElement(); System.out.println("\n\nService for "+root.getAttribute("title")); System.out.println(root.getAttribute("subtitle")); System.out.println("\n"); // Get the trains trains = root.getElementsByTagName("train"); // Find the desired train found = false; train = null; n = trains.getLength(); for (i=0; i < n && !found; i++) { train = (Element)trains.item(i); number = train.getAttribute("number"); found = (number.equals(args[0])); } // Find the desired station departureTime = null; if (found) { stops = train.getElementsByTagName("stop"); found = false; n = stops.getLength(); for (i=0; i < n && !found; i++) { stop = (Element)stops.item(i); // Get the station for this stop stations = stop.getElementsByTagName("station"); station = (Element)stations.item(0); // Get the text for this station textNodes = station.getChildNodes(); text = textNodes.item(0); stationName = text.getNodeValue(); // Is it the desired station? if (stationName.equals(args[1])) { found = true; // Get the time for this stop times = stop.getElementsByTagName("time"); time = (Element)times.item(0); // Get the text for this time textNodes = time.getChildNodes(); text = textNodes.item(0); departureTime = text.getNodeValue(); } } } if (!found) System.out.println("Sorry!"); else System.out.println("Train "+args[0]+ " departs "+args[1]+ " at "+departureTime); } }
Transformer
)
import java.io.*; import javax.xml.transform.*; import javax.xml.transform.stream.*; /** * Transform an XML file with an XSLT program * * @author Prof. David Bernstein, James Madison University * @version 1.0 */ public class XSLT { /** * The entry-point of the application * * @param args The command line arguments (.xml, .xsl) */ public static void main(String[] args) throws Exception { ByteArrayOutputStream bos; StreamResult result; StreamSource program, source; Transformer transformer; TransformerFactory factory; // Create the streams source = new StreamSource(new File(args[0])); program = new StreamSource(new File(args[1])); bos = new ByteArrayOutputStream(65536);// So we can process the result result = new StreamResult(bos); // Create the factory factory = TransformerFactory.newInstance(); transformer = factory.newTransformer(program); // Perform the transformation transformer.transform(source, result); // Print to the console System.out.print(bos.toString()); } }
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(true); factory.setValidating(true); factory.setAttribute( "http://java.sun.com/xml/jaxp/properties/schemaLanguage", "http://www.w3.org/2001/XMLSchema"); DocumentBuilder builder = factory.newDocumentBuilder(); // Then use the builder as before