// 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"); } } } 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 = "foobarbaz12345"; 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: */