【问题标题】:Feed byte[] to SAXParser将字节 [] 馈送到 SAXParser
【发布时间】:2014-10-13 02:27:39
【问题描述】:

我正在从管道处理程序对象中的底层网络层接收字节数组(实际上是 netty 的 ByteBufs),如下所示:

class Handler {
    ...
    private SAXParser parser = ...;
    private ContentHandler handler = ...;
    void process(byte[] request) {
        parser.parse(???, handler);
    }
}

Handler.process() 在每个请求中被调用多次(因为数据来自网络)。如何将数据提供给解析器不将请求缓冲到单个大数据单元中?

【问题讨论】:

    标签: java xml-parsing netty sax saxparser


    【解决方案1】:

    使用new ByteArrayInputStream(request)

    【讨论】:

    • 您能否提供一个使用ByteArrayInputStreamSAXParserHandler.process() 的示例?
    • 我问的是例如,因为parser.parse(new ByteArrayInputStream(request), handler); 仅将文档的一部分提供给解析器。
    • @Oroboros102 不幸的是,由于解析器不是流式传输并且需要提取数据字节,您应该使用多线程。一个线程进行解析,另一个线程将 byte[] 块提供给解析器线程。而且您应该以某种方式检测网络流中 XML 文档的结尾 - 即在数据包中拆分连续的字节流。您需要示例代码吗?
    • 感谢您的回答。 StAX 解析器可以成为解决方案并在同一个事件循环中解析 XML 吗?
    • @Oroboros102 不,StAX 解析器还期望 InputStream 从中提取数据。我不知道有任何库可以从推入其中的字节流中解析 XML。几年前我曾尝试创建这样的库,但放弃了该项目......也许我应该恢复它......
    【解决方案2】:

    几乎所有 XML 解析器都假定源总是在请求时提供它想要的字节。当源中的字节数不足时,它希望源阻塞,直到它有字节。

    这种设计与Netty通道等非阻塞源冲突。

    要解决此阻抗不匹配问题,您需要确保您的 ByteBuf 包含完整的 XML 文档。您可以确保使用XmlFrameDecoder。一旦XmlFrameDecoder 生成带有完整XML 文档的ByteBuf,您可以通过使用ByteBufInputStream 包装缓冲区将其提供给您最喜欢的解析器。例如:

    InputStream in = new ByteBufInputStream(buf);
    parser.parse(in, handler);
    

    【讨论】:

    • 要获取完整的 xml 文档,我可以使用 HttpObjectAggregator。事情是——我试图避免缓冲整个 xml。因为它可能真的很大。
    • 那么你需要一个可以处理非阻塞数据源的XML解析器,比如Aalto:github.com/FasterXML/aalto-xml
    • 谢谢,这就是我现在正在使用的。它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多