Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javasax解析器&;多个ContentHandler_Java_Android_Xml Parsing_Saxparser - Fatal编程技术网

javasax解析器&;多个ContentHandler

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

我已经在Android上使用
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, ...);
   }