Проблема, которую вы описали, звучит не так уж и сложно: Если , вы можете смело предположить, что каждый дочерний элемент элемента books является «элементом», тогда вы можете вызвать свой «обработчик элемента»«для каждого потомка.
Вот псевдокод, который (я думаю) будет работать, предполагая, что всегда и только элемент верхнего уровня документа:
class BookHandler extends DefaultHandler {
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
if (localName.equals("books") {
// Don't need to do anything with the top level element
return;
}
else {
handleItem(namespaceURI, localName, qName, atts);
}
}
public void endElement(String namespaceURI, String localName, String qName) {
if localName.equals("books") {
// Stop parsing and exit.
}
else {
// Stop parsing one item
}
}
private void handleItem(String namespaceURI, String localName,
String qName, Attributes atts) {
// Handle one item, including handling the "name" and
// "type" child attributes
if (localName.equals("name") {
// handle the name
}
else if (localName.equals("type") {
// handle the type
}
}
}
Даже какпсевдокод, это слишком упрощенно и безобразно.Альтернативный подход, который может быть преувеличен для ваших нужд, состоит в том, чтобы разбить ваше приложение на несколько ContentHandler
классов, распределяя ответственность по мере достижения начала или конца определенных элементов.
Например: предположим, чточто экземпляр BookHandler передается в вызов parser.parse () для обработки элементов верхнего уровня.Тогда:
class BookHandler extends DefaultHandler {
private ContentHandler m_parentHandler;
private ContentHandler m_childHandler = null;
// ... == appropriate args for the DefaultHandler constructor
public BookHandler(ContentHandler parent, Attributes atts, ...) {
super(...);
m_parentHandler = parent;
parent.getXMLReader().setHandler(this);
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
if (localName.equals("books") {
// Don't need to do anything with the top level element
return;
}
else {
// Assume it's a new item element. (Note: ItemHandler's constructor
// changes the parser's ContentHandler.)
m_childHandler = new ItemHandler(this, atts, ...);
}
}
public void endElement(String namespaceURI, String localName, String qName) {
if localName.equals("books") {
// Stop parsing and exit.
}
else {
// Note that this won't be called for "item" elements, UNLESS the
// ItemHandler's endElement method explicitly invokes this method.
// Stop parsing one item
}
}
}
class ItemHandler extends DefaultHandler {
private ContentHandler m_parentHandler;
// ItemInfo is a class that holds all info about the current item
private ItemInfo m_ItemInfo = null;
// ... == appropriate args for the DefaultHandler constructor
public ItemHandler(ContentHandler parent, Attributes atts, ...) {
super(...);
m_parentHandler = parent;
m_ItemInfo = new ItemInfo(atts);
parent.getXMLReader().setHandler(this);
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
if (localName.equals("name") {
// Handle the name. Update the current item as needed.
}
else if (localName.equals("type") {
// Handle the type. Update the current item as needed.
}
}
public void endElement(String namespaceURI, String localName, String qName) {
if localName.equals("name" || localName.equals("type") {
// Do nothing (?)
}
else {
// Stop parsing the current item;
// let the parent class handle the next element.
getXMLReader().setHandler(m_parentHandler);
// OPTIONALLY -- depending on your app's needs -- call the
// parent's endElement() method to let it know that we reached
// the end of an item.
m_parentHandler.endElement(namespaceURI, localName, qName);
}
}
}
Эта схема предлагает большую гибкость и больше возможностей для повторного использования.Например, потенциально элемент «books» теперь может быть дочерним по отношению к какому-либо другому элементу, например «департаментам», не требуя значительных изменений в этих классах.
Псевдокод не является идеальным для любогосредства.(Во-первых, я хотел бы еще немного подумать о том, где отключены обработчики - в родительском классе или в дочернем. Во-вторых, я мог бы зайти слишком далеко, сохранив ссылки на родителей и детей вэти классы.) Но я надеюсь, что это даст вам идеи, с которыми вы можете начать работать.