Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析连续的XML文档流_Java_Xml_Parsing - Fatal编程技术网

Java 解析连续的XML文档流

Java 解析连续的XML文档流,java,xml,parsing,Java,Xml,Parsing,我有一个用于外部系统的套接字连接,该系统接受命令并以XML格式发送结果。每个命令和结果都是一个独立的XML文档 我应该使用哪个Java解析器(/组合)来: 在不关闭连接的情况下连续解析流(我知道这很愚蠢,但我以前尝试过DOMParser,当流上遇到另一个完全可以理解的文档根时,它会抛出一个异常)。我需要这样的东西:不断地读取流,当一个文档被完全接收时,进行处理。我不知道文档有多大,所以我需要让解析器来确定文档的结尾 将每个传入文档反序列化为bean实例(类似于XStream) 将命令对象从带注

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

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

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

    • 您最好的选择可能是SAX解析器。使用它,您可以实现
      ContentHandler
      document,并在其中的
      endDocument
      方法中执行处理并准备下一个文档。请看一下本页:-以获取解释和示例。

      我建议您阅读一个完整的响应,然后解析它。然后读另一个。我认为没有必要不断地阅读回复。

      嗯。。。似乎是你需要的。我不确定提供的流是否必须将所有对象包含到根节点中,但无论如何,您可以安排一个inputstreams,添加一些虚拟内容以适应XStream的需要。稍后我将扩展此答案

      有一些样品

      根节点

      实际上,读取器需要一个根节点。因此,您需要一个输入流,它读取
      加上实际的字节内容,再加上末尾的
      (如果您介意的话)。根据您的需要(inputstream、readers),实现可能略有不同,但可以完成

      样本

      您可以使用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á
      
      InputStream realOne=。。
      //小心编码!
      InputStream root=newbytearrayinputstream(“.toBytes”(“UTF-8”);
      InputStream all=新序列InputStream(根,realOne);
      xstream.createObjectInputStream(带根);//拉齐奥之音
      

      如果你使用阅读器。。。好。必须有一些等价的东西:)

      检查发布,这可能会回答您的问题。遗憾的是,我不能使用它,因为我没有任何可用于分隔文档的处理标题。编码总是UTF-8,所以标题被省略了。遗憾的是,我不知道一个文档会有多长(将此添加到问题中,感谢您的提及)。我必须让解析器来判断XML文档何时结束。值得一试。但我真的不喜欢用黑客的解决方案来解决这个问题。希望我不需要你最后提到的赝品。谢谢你的样品。我将尝试这样做:)好吧,如果发送方使用根构建XML,就不会有问题。另一种方法是插入标记以指示不同的部分,这样您就可以很容易地找到SequenceInputStream的end.Changed PushbackInputStream。它更符合读取两个东西的想法,一个先读取,另一个先读取。我也做了相反的事情:绕过XStream头流式传输到套接字输出。我编写了一个简单的
      FilterOutputStream
      实现,它丢弃了头。SAX是一个基于事件的解析器。是否有任何解决方案可用于通过SAX反序列化对象?XStream不能将SAX用作读卡器。您应该能够基于
      InputStream
      使用
      InputSource
      初始化SAX解析器。看看这个页面:如果你想反序列化你的对象,在序列化之后,不管输入XML的长度是多少,你都会将对象保存在内存中。如果是这样的话,您确定不能按照gasan的建议去做(获取整个响应并解析它)?无论如何,您都将整个消息保存在内存中(尽管对象表示可能更小)。