解析连续XML文档流

时间:2012-02-08 11:47:37

标签: java xml parsing

我有一个外部系统的套接字连接,它接受命令并以XML格式发送结果。每个命令和结果都是一个独立的XML文档。

我应该使用哪种Java解析器(/组合):

  • 在不关闭连接的情况下连续解析流(我知道它很愚蠢,但我过去尝试过DOMParser,当流上遇到另一个文档根时,它会引发异常,这是完全可以理解的)。我需要这样的东西:不断读取流,当文档被完全接收时,执行它的处理。我不知道文档有多大,所以我需要留给解析器找出文档的结尾。
  • 将每个传入的文档反序列化为bean实例(类似于XStream)
  • 将命令对象序列化为来自带注释的类实例的输出流(类似于XStream)。我不想使用两个单独的库来发送和接收。

3 个答案:

答案 0 :(得分:2)

嗯...... XStream.createObjectInputStream似乎就是你所需要的。我不确定提供的流是否必须将所有对象都包含在根节点中,但无论如何,您可以安排一个输入流来添加一些虚拟内容以满足XStream需求。我稍后会扩展这个答案......

http://x-stream.github.io/objectstream.html有一些样本......

根节点

确实,读者需要一个根节点。因此,您需要一个读取<object-stream>加上实际字节内容的输入流,最后加上</object-stream>(如果您考虑到这一点)。根据您的需要(输入流,读者),实现可能略有不同,但可以完成。

<强>示例

您可以使用SequenceInputStream将虚拟内容连接到原始输入流:

InputStream realOne = ..
// beware of the encoding!
InputStream root = new ByteArrayInputStream("<object-stream>".toBytes("UTF-8")); 
InputStream all = new SequenceInputStream(root, realOne);

xstream.createObjectInputStream(withRoot); // voi lá

如果你使用读者......好吧。必须有相同的东西:)

答案 1 :(得分:0)

你最好的选择可能是SAX解析器。有了它,您可以实现ContentHandler文档,并在endDocument方法中,进行处理并准备下一个文档。请查看此页面:http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html - 有关说明和示例。

答案 2 :(得分:0)

我会说你读了一个完整的完整回复,然后解析它。然后阅读另一个。我认为没有必要继续阅读回复。