我在 Android 上使用XmlReader
and编写了一个 Java SAX 解析器DefaultHandler
。
它不断增长的规模变得笨拙,所以我想做的是将某些元素下的内容的责任委托给“子”处理程序。
假设我有 XML:
<fruit>
<apples>
<pips/>
</apples>
<oranges>
<seeds/>
</oranges>
</fruit>
我打算让原始处理程序实现移交,以分离苹果、橙子等的相应处理程序,并在完成后将这些处理程序收回。
因此,我做了一些这样的事情:
@Override
public void startElement( ... ) ...
{
//...
if ( localName.equals("oranges"))
{
ContentHandler orangeHandler = new OrangeHandler( xmlReader, this );
xmlReader.setContentHandler( orangeHandler );
}
super.startElement( uri, localName, qName, attributes );
}
然后以类似的方式恢复主处理程序。
我期望看到的:对 startElement()、characters()、endElement() 等的进一步调用转到新的处理程序。
我实际看到的:那个,但是在主处理程序上继续调用这些方法。
Javadoc 说:
公共无效 setContentHandler(内容处理程序处理程序)
允许应用程序注册内容事件处理程序。
如果应用程序没有注册内容处理程序,则 SAX 解析器报告的所有内容事件都将被静默忽略。
应用程序可以在解析过程中注册一个新的或不同的处理程序,并且 SAX 解析器必须立即开始使用新的处理程序。
我可以通过保留我自己是否授权的记录并忽略那些多余的电话来绕过报告行为,但这让我怀疑我是否在做一些愚蠢的事情,以后会咬我。
有没有人有这方面的经验?