javasax解析器&;多个ContentHandler
我已经在Android上使用javasax解析器&;多个ContentHandler,java,android,xml-parsing,saxparser,Java,Android,Xml Parsing,Saxparser,我已经在Android上使用XmlReader和DefaultHandler编写了一个Java SAX解析器 它不断增长的大小已经变得难以处理,所以我想做的是将某些元素下内容的责任委托给“子”处理程序 假设我有XML: <fruit> <apples> <pips/> </apples> <oranges> <seeds/> </oranges> </frui
XmlReader
和DefaultHandler
编写了一个Java SAX解析器
它不断增长的大小已经变得难以处理,所以我想做的是将某些元素下内容的责任委托给“子”处理程序
假设我有XML:
<fruit>
<apples>
<pips/>
</apples>
<oranges>
<seeds/>
</oranges>
</fruit>
然后以类似的方式还原主处理程序
我希望看到的内容:对startElement()、characters()、endElement()等的进一步调用转到新的处理程序
我实际看到的内容是:,但也继续在主处理程序上调用这些方法
Javadoc说:
public void setContentHandler(ContentHandler)
允许应用程序注册内容事件处理程序
如果应用程序未注册内容处理程序,SAX解析器报告的所有内容事件将被静默忽略
应用程序可以在解析过程中登记一个新的或不同的处理程序,SAX解析器必须使用新的处理程序开始。
马上
我可以通过保存自己的记录来避免报告行为,不管我是否授权,并忽略那些多余的电话,但这让我怀疑我是否在做一些愚蠢的事情,以后会伤害我
有人有这方面的经验吗?我认为维护发出回调的原始SAX解析器可能更容易,并在下面的单独处理程序中进行替换,只使用不同的实现代理SAX回调方法,但不执行实际的XML读取,正如您目前所做的那样 e、 g.(伪代码)
并根据需要将
代理
交换到不同的实现。我怀疑您需要一个代理堆栈,并在相应的endElement()
回调时弹出堆栈。作为解决方案,我发现这是我自己代码中的一个错误-与问题中的代码相比,更复杂的现实是我有多个级别的委托,再加上对委托点的重新处理,即
if ( localName.equals("oranges"))
{
ContentHandler orangeHandler = new OrangeHandler( xmlReader, this );
xmlReader.setContentHandler( orangeHandler );
orangeHandler.startElement( ..., localName, ...);
}
在这样做的过程中,我对内容处理程序和startElement调用进行了不适当的排序,这在第二次授权时合谋设置了错误的处理程序
我不认为这会降低我的复杂性,但是@Brian选择的设计会简化解析流本身的委托,所以我接受这一点作为答案。基于堆栈的代理思想比对象父/子关系更整洁,所以我喜欢这一点。在解析中创建的对象层次结构仍然需要从每个阶段传播回来,所以我需要考虑如何翻译。我只是这么做了-在我的startElement方法中注册一个新的内容处理程序,所有“trafic”都转到了新的。
class SaxHandler {
SaxProxy proxy = new SaxProxyImpl();
public void startElement(e) {
proxy.startElement(e);
}
}
if ( localName.equals("oranges"))
{
ContentHandler orangeHandler = new OrangeHandler( xmlReader, this );
xmlReader.setContentHandler( orangeHandler );
orangeHandler.startElement( ..., localName, ...);
}