Предполагая, что вы несете ответственность за размещение документов в потоке, должно быть легко разделить документы каким-либо образом. Например:
// Any value that is invalid for an XML character will do.
static final char DOC_TERMINATOR=4;
BOOL addDocumentToStream(BufferedWriter streamOut, char xmlData[])
{
streamOut.write(xmlData);
streamOut.write(DOC_TERMINATOR);
}
Затем при чтении из потока считывается в массив, пока не встретится DOC_TERMINATOR.
char *getNextDocuument(BufferedReader streamIn)
{
StringBuffer buffer = new StringBuffer();
int character;
while (true)
{
character = streamIn.read();
if (character == DOC_TERMINATOR)
break;
buffer.append(character);
}
return buffer.toString().toCharArray();
}
Поскольку 4 - недопустимое значение символа, вы не встретите его, за исключением случаев, когда вы явно добавляете его. Таким образом, вы можете разделить документы. Теперь просто оберните соответствующий массив символов для ввода в SAX и все готово.
...
XMLReader xmlReader = XMLReaderFactory.createXMLReader();
...
while (true)
{
char xmlDoc = getNextDocument(streamIn);
if (xmlDoc.length == 0)
break;
InputSource saxInputSource = new InputSource(new CharArrayReader(xmlDoc));
xmlReader.parse(saxInputSource);
}
...
Обратите внимание, что цикл завершается, когда он получает документ длиной 0. Это означает, что вы должны либо добавить второй DOC_TERMINATOR после того, как последнему документу вам нужно добавить что-то, чтобы обнаружить конец потока в getNextDocument ().