gpt4 book ai didi

Java SAX 解析器和多个 ContentHandler

转载 作者:行者123 更新时间:2023-12-02 06:55:20 24 4
gpt4 key购买 nike

我在 Android 上使用 XmlReaderDefaultHandler 编写了一个 Java SAX 解析器。

它不断增长的规模已经变得笨重,所以我想做的是将某些元素下的内容的责任委托(delegate)给“子”处理程序。

假设我有 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 handler)

Allow an application to register a content event handler.

If the application does not register a content handler, all content events reported by the SAX parser will be silently ignored.

Applications may register a new or different handler in the middle of a parse, and the SAX parser must begin using the new handler immediately.

我可以通过保留自己是否授权的记录并忽略那些多余的调用来绕过报告行为,但这让我怀疑我是否在做一些愚蠢的事情,以后会咬我。

有人有这方面的经验吗?

最佳答案

我认为维护发出回调的原始 SAX 解析器可能更容易,并替换为下面的单独处理程序,这些处理程序只是用不同的实现代理 SAX 回调方法,但不执行实际的 XML 读取,就像您目前正在做的那样。

例如(伪代码)

class SaxHandler {
SaxProxy proxy = new SaxProxyImpl();
public void startElement(e) {
proxy.startElement(e);
}
}

并根据需要将您的代理交换为不同的实现。我怀疑您需要一堆代理,并在适当的 endElement() 回调上弹出您的堆栈。

关于Java SAX 解析器和多个 ContentHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17447055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com