我正在寫一個客戶端,它需要通過套接字讀取多個連續的小XML文檔。我可以假設編碼始終是UTF-8,並且可以選擇在文檔之間劃定空白。這些文檔應該最終進入DOM對象。什麼是完成這個最好的方法?從java中的套接字讀取多個xml文檔
問題的根本在於解析器期望流中的單個文檔並考慮其餘的內容垃圾。我認爲我可以通過跟蹤元素深度來人爲地結束文檔,並使用現有的輸入流創建新的閱讀器。例如。類似:
// 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;
}
}
}
然而運行此上輸入諸如<一個> < /一個> <b> </B > <Ç> </c中的第一文檔打印>並拋出XMLStreamException。什麼是正確的方法來做到這一點?
說明:不幸的是,協議是由服務器修復的,無法更改,所以預先設置長度或包裝內容不起作用。
難道你不能只捕獲XMLStreamException並將其用作觸發器來再次解析下一個文檔的輸入流嗎? – 2009-05-28 14:15:15