// like Integer, but can be modified; I use it to pass a number "by reference"class MutableInteger { public int num;}class SampleData { //meh, in C++, this class would have a std::string (which is mutable) and //an int I can then pass by pointer, instead of this mess :) public StringBuilder string; public MutableInteger num;}class NumberHandler extends XMLHandler { public NumberHandler(MutableInteger result) { this.result = result; } public void characterData(char[] data) { int i; for (i=0; i<data.length; ++i) { if ('0' <= data[i] && data[i] <= '9') { result.num *= 10; result.num += data[i] - '0'; } else { throw new XMLException("Non-digit found in <data>"); } } } private MutableInteger result;}class DataHandler extends XMLHandler { public DataHandler(SampleData data) { this.data = data; inData = false; inString = false; } public void startElement(String name) { if (name.equals("data")) { inData = true; } else if (name.equals("string") && inData) { inString = true; } else if (name.equals("num") && inData) { pushHandler(new NumberHandler(data.num)); } } public void endElement(String name) { if (name.equals("data")) { if (inData) { inData = false; } else { throw new XMLException("end of data but we weren't in data"); } } else if (name.equals("string")) { if (inString) { inString = false; } else { throw new XMLException("end of string but we weren't in string"); } } } public void characterData(char[] s) { if (inString) { data.string.append(s); } } private SampleData data; private boolean inData, inString;};class MainTest { public static void main(String args[]) { String xml = "<data><string>foobarbaz</string><num>12345</num></data>"; SampleData data = new SampleData(); XMLParser parser = new XMLParser(); parser.pushHandler(new DataHandler(data)); try { parser.parse(xml); } catch(XMLException e) { System.err.println("Parse error: " + e.getMessage()); System.exit(1); } if (!data.string.equals("foobarbaz")) { System.err.println("Parsed string doesn't match"); System.exit(1); } if (data.num != 12345) { System.err.println("Parsed number doesn't match"); System.exit(1); } }}/* vim: set ts=4 sw=4 et: */