gpt4 book ai didi

Java XML : Keeping a copy of a partial XML tree when parsing from a socket

转载 作者:行者123 更新时间:2023-12-02 07:53:32 25 4
gpt4 key购买 nike

我有一个套接字输入到 sax 解析器中,格式为 ISO 8859/1 流。每隔一段时间就会出现一个无效字符,我会收到一个 SAXParseException 异常,其中包含发生该情况的行和列,因此我需要查看此时的数据是什么(或更重要的是记录它)。

最初处理数据的行是:

InputSource is = new InputSource(new InputStreamReader(socket.getInputStream(), "ISO8859_1"));
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(new ResponseParseHandler(etc, id));
reader.parse(is);

问题是发生这种情况后我无法获取数据,因此我将其更改为读入大字节缓冲区,将其转换为字符串并使用 StringReader 解析该数据。不幸的是,来自套接字的数据在很长一段时间内以小块的形式分散,因此第一次连接时它将以根标记开始,但随后将出现数千条没有结束标记的单独消息。

因为当这些字符串出现时,我会单独解析这些字符串,第一个字符串会出现错误,因为它没有结束标记,而以下字符串会出现错误,因为它们没有基本标记。套接字不会发生这种情况,因为我假设流仍然打开

大概我可以将这些字符串提供给另一个读取器/写入器,但仅仅找出错误发生时的数据 block 是什么似乎变得非常复杂。

我在这里缺少一些非常简单的东西吗?

最佳答案

上次我遇到类似的问题时,我用 SplittingWriter 解决了它。这是围绕另外两个 Writer 的装饰器样式类,当某些内容“写入”到 SplittingWriter 时,它只是将写入调用委托(delegate)给其两个底层 作家。



就您而言,您需要类似 SplittingInputStreamReader 的东西,它将实现 InputStreamReader 并将其传递给 InputSource 而不是您当前正在使用的InputStreamReader



在其构造函数中,SplittingInputStreamReader 将获取当前的 InputStreamReader 和其他一些对象,我们将其称为 Foo。然后,SplittingInputStreamReader 上的 read 方法的实现会将读取调用委托(delegate)给底层 InputStreamReader,将这些调用的结果推送到 Foo,然后将这些调用的结果返回给调用它的对象。因此,您的 int read() 方法的实现将类似于:




@Override
public int read() {
int r = this.inputStreamReader.read();
this.foo.submit(r);
return r;
}

这样,当您通过 SplittingInputStreamReader 读取时,您还可以写入 Foo,假设您给出了 Foo,您就可以看到写入停止的位置。 一个不错的界面。最后,在实现 SplittingInputStreamReaderFoo 后,您的代码将如下所示:


Foo streamCapture = new Foo();
SplittingInputStreamReader streamReader = new SplittingInputStreamReader(
new InputStreamReader(socket.getInputStream(), "ISO8859_1"), streamCapture);
InputSource is = new InputSource(streamReader);
XMLReader reader = XMLReaderFactory.createXMLReader();
reader.setContentHandler(new ResponseParseHandler(etc, id));
reader.parse(is);
// After parse, if there was an error, check what is in Foo streamCapture

关于Java XML : Keeping a copy of a partial XML tree when parsing from a socket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9924703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com