2012-02-08 27 views
3

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

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

  • 不断解析流而不关闭连接(我知道这是愚蠢的,但我在过去尝试过的DOMParser和它抛出一个异常时在流中遇到的另一个文档根目录是完全可以理解的)。我需要的东西如下:不断读取流,并在文档完全收到时,处理它。我不知道文档有多大,所以我需要离开解析器来找出文档的末尾。
  • 反序列化每个传入文档到bean实例(与之相似像XStream的那样)
  • 连载命令对象到输出流从注释的类实例(类似于像XStream的一样)。我不想使用两个单独的库进行发送和接收。
+1

看看[这](http://stackoverflow.com/questions/3302575)张贴,可能会回答你的问题。 – 2012-02-08 11:55:28

+0

可悲的是我不能使用它,因为我没有得到任何可以用来分隔文档的处理头。编码始终是UTF-8,因此简单地省略标题。 – NagyI 2012-02-08 12:13:35

回答

2

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

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

根节点

事实上,读者需要一个根节点。所以你需要一个输入流,其末尾加上<object-stream>加上真实的字节内容,再加上</object-stream>(如果你介意这一点)。根据你所需要的(输入流,读者),实现可能会有些不同,但是可以完成。

样品

可以使用的SequenceInputStream虚拟内容串联到原来的InputStream:如果您使用的读者......嗯

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á 

。必须有东西等效:)

+0

值得一试。但我真的不喜欢为此使用黑客入侵的解决方案。希望我不需要你在最后提到的伪造。 – NagyI 2012-02-08 12:08:22

+0

谢谢你的示例。我会试试:) – NagyI 2012-02-08 12:16:49

+0

那么,如果发件人用一个根建立XML就没有问题了。另一种方式可以是插入标记来指示不同的部分,以便您可以轻松找到结尾。 – helios 2012-02-08 12:17:34

0

你最好的选择可能是SAX解析器。有了它,你可以实现ContentHandler文件,并在那里,在endDocument方法中,做处理和准备下一个文件。看看这个页面:http://docs.oracle.com/javase/tutorial/jaxp/sax/parsing.html - 解释和例子。

+0

SAX是一个基于事件的解析器。是否有任何解决方案可用于通过SAX反序列化对象?例如。 XStream不能将SAX用作阅读器。 – NagyI 2012-02-08 12:10:43

+0

你应该能够根据你的'InputStream'用'InputSource'初始化SAX解析器。看看这个页面:http://www.ibm.com/developerworks/xml/library/x-tipsaxis/index。html – 2012-02-08 12:24:17

+0

如果要反序列化对象,则无论输入XML的长度是多少,都将序列化后的对象保留在内存中。如果是这样的话,你确定你不能像gasan建议那样做(得到整个回答并解析它)?无论如何,你都将整条消息保存在内存中(尽管可能对象表示可能更小)。 – fpacifici 2012-02-10 15:40:54

0

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

+0

很遗憾,我不知道文档将会存在多长时间(将此添加到该问题中,谢谢您提及它)。我必须将它留给解析器来确定XML文档何时结束。 – NagyI 2012-02-08 12:06:40