有没有一种方法可以在不关闭客户端流的情况下从套接字inputstream解析xml文档?我只控制接收XML的服务器端,套接字将保持打开状态,因为服务器将向客户端发送响应。
我能告诉它在找到根元素结束标记时停止并返回文档吗?我需要修改解析器,不是吗?
既然文档中有多个根元素会使文档格式不好,那么为什么还要费心进一步解析呢?
它在结束元素之后继续解析,因为它检查的是后面的注释或处理指令,在我的例子中,我不关心这些,并且会忽略它们。
我发送的XML
是
格式良好,并且从fileinputstream正确解析,因为它有一个清晰的eof,但是在从未关闭的套接字inputstream解析时挂起。
客户端在发送XML后不会关闭流,因为它们希望通过套接字得到响应。
这是我的代码:
try (
ServerSocket server = new ServerSocket(port);
Socket sock = server.accept();
InputStream in = sock.getInputStream(); ) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
db.setErrorHandler(MyErrorHandler);
db.setEntityResolver(MyEntityResolver);
// below hangs, waiting for stream to close I think
Document doc = db.parse(in);
// .. process document
// .. send response
}
这是它挂在哪里的堆栈跟踪:
SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]
SocketInputStream.socketRead(FileDescriptor, byte[], int, int, int) line: 116
SocketInputStream.read(byte[], int, int, int) line: 171
SocketInputStream.read(byte[], int, int) line: 141
XMLEntityManager$RewindableInputStream.read(byte[], int, int) line: 2919
UTF8Reader.read(char[], int, int) line: 302
XMLEntityScanner.load(int, boolean, boolean) line: 1895
XMLEntityScanner.skipSpaces() line: 1685
XMLDocumentScannerImpl$TrailingMiscDriver.next() line: 1371
XMLDocumentScannerImpl.next() line: 602
XMLDocumentScannerImpl(XMLDocumentFragmentScannerImpl).scanDocument(boolean) line: 505
XIncludeAwareParserConfiguration(XML11Configuration).parse(boolean) line: 841
XIncludeAwareParserConfiguration(XML11Configuration).parse(XMLInputSource) line: 770
DOMParser(XMLParser).parse(XMLInputSource) line: 141
DOMParser.parse(InputSource) line: 243
DocumentBuilderImpl.parse(InputSource) line: 339
DocumentBuilderImpl(DocumentBuilder).parse(InputStream) line: 121
谢谢你的建议。