代码之家  ›  专栏  ›  技术社区  ›  balu

关闭SAX解析器的流的最佳方法是在解析过程中读取?

  •  0
  • balu  · 技术社区  · 17 年前

    让我们直接回答我的问题:我有一个套接字,通过这个套接字/流的所有输入都由我的SAX解析器解析。现在,在发生某个解析事件时,我想从SAX事件处理程序中关闭套接字/流。另外,在特定情况下,我希望在解析器仍在工作时从外部关闭流。 不幸的是,如果解析器没有抛出异常(意外的文档结尾…),我就无法完成这两件事。好的,我可以捕获这个异常,但是您知道如何安全地关闭流的解决方案吗?

    3 回复  |  直到 8 年前
        1
  •  3
  •   Brian Agnew    17 年前

    我认为你不容易做到这一点。您给SAX解析器一个要读取的资源(流),然后关闭它,SAX解析器仍然希望从中读取—因此它(并非不合理地!)抛出了一个“意外的文档结尾”。

    如果您想干净地执行此操作,我认为您的SAX解析器 handler 一旦您决定忽略进一步的事件,您已经实现的应该默默地吞下事件。

    e、 g.您对 startElement() endElement() etc应在处理之前检查您是否仍对这些事件感兴趣。

    这样,SAX解析器就可以干净地运行到文档末尾,而无需再处理任何事件。

    或者,为什么不记录您已经关闭了输入流的事实,然后当您得到一个“意外文档结束”事件时,看看它是否真的关闭了

        2
  •  0
  •   Jonathan Adelson    17 年前

    如果控制文档生成端,则可以设置关闭请求消息以发送回服务器并结束传入文档。根据您整个系统的详细信息,这可能是一个丑陋的黑客攻击,也可能是一个优雅的解决方案……:)

        3
  •  0
  •   StaxMan    17 年前

    这可能是显而易见的,但对于这样的用例 Stax parser 可能更合适。 由于应用程序通过迭代控制读取,所以它可以在任何给定点关闭解析器和底层流。使用SAX时,必须抛出一个异常,该异常不是特别优雅或高效。另外,您只能从处理程序内部执行此操作。

    额外的分数, StaxMate

    最后:如果您的问题是由于套接字造成的阻塞,那么使用传统的基于阻塞IO的xml解析器可能很难解决。有一个开源xml解析器可以进行非阻塞(异步)解析,但这一点鲜为人知,因此我将把这一发现留给感兴趣的读者。:-)

    推荐文章
    robyp7  ·  fo:表到html表-xslt
    11 年前