【发布时间】:2013-07-01 02:06:28
【问题描述】:
我在 Android 上使用 XmlReader 和 DefaultHandler 编写了一个 Java SAX 解析器。
它不断增长的规模变得笨拙,所以我想做的是将某些元素下的内容的责任委托给“子”处理程序。
假设我有 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 说:
public void setContentHandler(ContentHandler 处理程序)
允许应用程序注册内容事件处理程序。
如果应用程序未注册内容处理程序,则 SAX 解析器报告的所有内容事件都将被静默忽略。
应用程序可能会在解析过程中注册一个新的或不同的处理程序,并且 SAX 解析器必须开始使用新的处理程序 马上。
我可以通过保留我自己是否授权的记录并忽略那些多余的电话来规避报告行为,但这让我怀疑我是否在做一些以后会咬我的蠢事。
有人有这方面的经验吗?
【问题讨论】:
-
我只是这样做了 - 在我的 startElement 方法中注册一个新的内容处理程序,所有“流量”都转到新的。
标签: java android xml-parsing saxparser