我在寻找,与其从InputStream或InputSource的分析反而使文本块被推入解析器XML解析器。 例如,我想有像下面这样:
public class DataReceiver {
private SAXParser parser = //...
private DefaultHandler handler = //...
/**
* Called each time some data is received.
*/
public void onDataReceived(byte[] data) {
parser.push(data, handler);
}
}
其原因是,我想的东西,将起到很好的与NIO网络库,而不是恢复到每支持一个阻塞的InputStream所需的连接模式的线程。
这是从Xerces的J-用户邮件列表,其中原始海报具有完全相同的问题上(2009年4月)后。 由“杰夫”一个潜在的非常好的给出响应,但没有跟进到原来的海报的反应:
http://www.nabble.com/parsing-an-xml-document-chunk-by-chunk-td22945319.html
这是潜在的足够多的新磕碰就行了,或者最起码与搜索帮助。
编辑
发现了另一个有用的链接,提了一个名为Woodstox库和描述流的状态与基于NIO解析器和一些可能的方法来模拟流:
http://markmail.org/message/ogqqcj7dt3lwkbov
令人惊讶的没有人提到一个Java的XML解析器,确实实现无阻塞(“异步”)解析: 阿尔托 。 部分原因可能是缺乏文档(和活性低的水平)的。 阿尔托实现了基本的API斯塔克斯,也是轻微的扩展,允许推动输入(这部分还没有完成;功能存在,但API尚未最终确定)。 欲了解更多信息,你可以看看相关的讨论小组 。
编辑:现在我明白了。 您会收到以块的XML,并希望将其送入一个适当的XML解析器。 所以,你需要一个对象,它是在一端的队列,一个InputStream在另一端?
你可以聚集接收到一个ByteArrayOutputStream字节数组,将其转换成ByteArrayInputStream的和它喂到SAXParser的。
或者你可以检查出的PipedInputStream /的PipedOutputStream对。 在这种情况下,你需要做的分析在另一个线程作为SAX解析器使用当前线程发出事件,阻止您的接收()。
编辑 :根据我建议采取聚合路由中的注释。 你收集到块一个ByteArrayOutputStream。 要知道你是否收到的所有数据块为XML,检查当前块或ByteArrayOutputStream的内容包含XML根节点的结束标记。 然后,你可以只将数据传递到可以在当前线程没有问题,现在运行的SAXParser。 为了避免不必要的阵列重新创作,你可以实现自己的不同步的简单的字节数组的包装或寻找这样的实现。
检查的Openfire的 XMLLeightweightParser以及它是如何产生的,因为NIO的单块XML消息。 整个项目是关于NIO和XMPP问题的答案的重要来源。
添加另一种答案,因为这问题仍然很高有关谷歌搜索- 阿尔托的XML 0.9.7(2011年3月)的异步XML考取。 这使您可以通过文档的任意大小的块,继续解析,以及新的STAX事件类型EVENT_INCOMPLETE
指示输入缓冲区耗尽,该文件仍然不完整的。
这是大肚Salorant的 (笔者)例如:
byte[] msg = "<html>Very <b>simple</b> input document!</html>".getBytes();
AsyncXMLStreamReader asyncReader = new InputFactoryImpl().createAsyncXMLStreamReader();
final AsyncInputFeeder feeder = asyncReader.getInputFeeder();
int inputPtr = 0; // as we feed byte at a time
int type = 0;
do {
// May need to feed multiple "segments"
while ((type = asyncReader.next()) == AsyncXMLStreamReader.EVENT_INCOMPLETE) {
feeder.feedInput(msg, inputPtr++, 1);
if (inputPtr >= msg.length) { // to indicate end-of-content (important for error handling)
feeder.endOfInput();
}
}
// and once we have full event, we just dump out event type (for now)
System.out.println("Got event of type: "+type);
// could also just copy event as is, using Stax, or do any other normal non-blocking handling:
// xmlStreamWriter.copyEventFromReader(asyncReader, false);
} while (type != AsyncXMLStreamReader.END_DOCUMENT);
NioSax与工作的ByteBuffers
http://blog.retep.org/2010/06/25/niosax-sax-style-xml-parser-for-java-nio/
最新的版本的源代码,我能找到(10.6自2010年)是Sonatype的Maven仓库:
https://oss.sonatype.org/content/repositories/releases/uk/org/retep/
对不起,我没有设法解决这个问题。 我找不到像我需要一个解析器。 但我想编写一个由我自己。 一个非常简单的:就如同fisibility研究,但足以解决我的问题和hopfully你的。 Unortunatelly我一直很buisy和接下来的两个星期我会出,但也许在7月,我会开始工作。 我会告诉你,只要我有东西的工作知道的。
公吨