让我们直截了当地提出我的问题:我有一个套接字,所有来自此套接字/流的输入都由我的SAX解析器解析。现在,在某个解析事件时,我想从我的SAX事件处理程序中关闭套接字/流。此外,我想在解析器仍在工作时在某种情况下从外部关闭流。 不幸的是,如果解析器没有抛出异常(意外的文档结束......),我就无法做到这一件事。好的,我可以抓住这个例外,但你知道如何安全地关闭流吗?
答案 0 :(得分:3)
我认为你不能轻易做到这一点。你给SAX解析器一个资源(一个流)来读取,然后你关闭它,SAX解析器仍然期望从它读取 - 因此它(不是不合理地!)抛出'意外的文档结束'。
如果你想干净利落地做到这一点,我认为你已经实现的SAX解析器handler应该在你决定忽略更多事件后静默地吞下事件。
e.g。您的startElement()
,endElement()
等实现应检查您是否仍然对这些事件感兴趣,然后再进行处理。
这样SAX解析器可以干净地运行到文档的末尾,而无需再处理任何事件。
或者,为什么不记录您已关闭输入流的事实,然后当您收到“意外文档结束”事件时,看看它实际上是否。并且只有在出现意外情况时才会记录错误。
答案 1 :(得分:0)
如果您控制文档生成端,则可以设置关闭请求消息以发送回服务器并使传入文档结束。根据整个系统的细节,这可能是一个丑陋的黑客或优雅的解决方案...... :)
答案 2 :(得分:0)
这可能是显而易见的,但对于这样的用例,Stax parser可能更适合。 由于应用程序控制通过迭代读取它可以在任何给定点关闭解析器和底层流。使用SAX,您将不得不抛出异常,这不是特别优雅或高效。另外,你只能从处理程序中做到这一点。
对于加分,StaxMate可以更加愉快地使用Stax;没有它Stax具有与SAX类似的低抽象级别。
最后:如果您的问题是由于套接字导致阻塞,那么使用传统的基于阻塞IO的xml解析器可能很难解决。有一个开源xml解析器可以进行非阻塞(异步)解析,但是鲜为人知,所以我会把这个发现留给感兴趣的读者。 : - )