У меня был хороший опыт с этим подходом:
- Создание таблицы поиска для сопоставления имен узлов с функциями-обработчиками. Скорее всего, вам потребуется поддерживать два обработчика для каждого имени узла, один для начала и один для конечного тега.
- Ведение стека родительских узлов.
- Вызовите обработчик из таблицы поиска.
- Каждая функция обработчика может выполнять свои задачи без дополнительных проверок. Но при необходимости каждый обработчик также может определить текущий контекст, просматривая стек родительского узла. Это становится важным, если у вас есть узлы с одинаковыми именами в разных местах иерархии узлов.
Некоторый псевдо-Java-код:
public class MyHandler extends DefaultHandler {
private Map<String, MyCallbackAdapter> startLookup = new HashMap<String, MyCallbackAdapter>();
private Map<String, MyCallbackAdapter> endLookup = new HashMap<String, MyCallbackAdapter>();
private Stack<String> nodeStack = new Stack<String>();
public MyHandler() {
// Initialize the lookup tables
startLookup.put("Office", new MyCallbackAdapter() {
public void execute() { myOfficeStart() }
});
endLookup.put("Office", new MyCallbackAdapter() {
public void execute() { myOfficeEnd() }
});
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
nodeStack.push(localName);
MyCallbackAdapter callback = startLookup.get(localName);
if (callback != null)
callback.execute();
}
public void endElement(String namespaceURI, String localName, String qName)
MyCallbackAdapter callback = endLookup.get(localName);
if (callback != null)
callback.execute();
nodeStack.pop();
}
private void myOfficeStart() {
// Do the stuff necessary for the "Office" start tag
}
private void myOfficeEnd() {
// Do the stuff necessary for the "Office" end tag
}
//...
}
Общие советы:
В зависимости от ваших требований вам может потребоваться дополнительная контекстная информация, например, имя предыдущего узла или текущий узел пуст. Если вы обнаружите, что добавляете все больше и больше контекстной информации, вы можете подумать о переключении на полноценный анализатор DOM, если только скорость выполнения не важнее скорости разработки.