我在Android上使用 XmlReader 和 DefaultHandler 编写了一个Java SAX解析器 .
它不断增长的规模变得笨拙,所以我想做的是将某些元素下的内容责任委托给“儿童”处理程序 .
假设我有XML:
我打算让原始的处理程序实现切换为苹果,橙子等各自的处理程序分开,并在完成后将这些处理回传 .
因此,我做的事情有点像这样:
@Override
public void startElement( ... ) ...
{
//...
if ( localName.equals("oranges"))
{
ContentHandler orangeHandler = new OrangeHandler( xmlReader, this );
xmlReader.setContentHandler( orangeHandler );
}
super.startElement( uri, localName, qName, attributes );
}
然后以类似的方式恢复主处理程序 .
What I expect to see :进一步调用startElement(),characters(),endElement()等转到新的处理程序 .
What I actually see :那,但是继续调用主处理程序上的那些方法 .
Javadoc说:
public void setContentHandler(ContentHandler handler)允许应用程序注册内容事件处理程序 . 如果应用程序未注册内容处理程序,则将自动忽略SAX解析器报告的所有内容事件 . 应用程序可以在解析过程中注册新的或不同的处理程序,SAX解析器必须立即开始使用新的处理程序 .
我可以通过保留自己是否委派的记录,忽略那些多余的来电来解决报告行为,但这让我想知道我是否做了一些愚蠢的事情,以后会咬我 .
有没有人有这方面的经验?