【发布时间】:2009-05-28 13:42:53
【问题描述】:
我正在编写一个客户端,它需要通过一个套接字读取多个连续的小型 XML 文档。我可以假设编码始终是 UTF-8,并且文档之间可以选择分隔空格。文档最终应该进入 DOM 对象。实现这一目标的最佳方法是什么?
问题的本质是解析器期望流中的单个文档并考虑其余内容垃圾。我认为我可以通过跟踪元素深度来人为地结束文档,并使用现有的输入流创建一个新的阅读器。例如。类似:
// Broken
public void parseInputStream(InputStream inputStream) throws Exception
{
XMLInputFactory factory = XMLInputFactory.newInstance();
XMLOutputFactory xof = XMLOutputFactory.newInstance();
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document doc = documentBuilder.newDocument();
XMLEventWriter domWriter = xof.createXMLEventWriter(new DOMResult(doc));
XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputStream);
XMLEventReader reader = factory.createXMLEventReader(xmlStreamReader);
int depth = 0;
while (reader.hasNext()) {
XMLEvent evt = reader.nextEvent();
domWriter.add(evt);
switch (evt.getEventType()) {
case XMLEvent.START_ELEMENT:
depth++;
break;
case XMLEvent.END_ELEMENT:
depth--;
if (depth == 0)
{
domWriter.add(eventFactory.createEndDocument());
System.out.println(doc);
reader.close();
xmlStreamReader.close();
xmlStreamReader = factory.createXMLStreamReader(inputStream);
reader = factory.createXMLEventReader(xmlStreamReader);
doc = documentBuilder.newDocument();
domWriter = xof.createXMLEventWriter(new DOMResult(doc));
domWriter.add(eventFactory.createStartDocument());
}
break;
}
}
}
但是,在诸如
澄清:不幸的是,协议由服务器固定,无法更改,因此添加长度或包装内容将不起作用。
【问题讨论】:
-
你不能只捕获 XMLStreamException 并将其用作触发器来再次解析下一个文档的输入流吗?