Привет
У меня также была эта проблема на работе (поэтому не буду публиковать полученный код). Самое элегантное решение, которое я мог придумать, и которое работает довольно хорошо imo, заключается в следующем:
Создайте класс, например DocumentSplittingInputStream, который расширяет InputStream и принимает базовый inputtream в своем конструкторе (или устанавливается после построения ...).
Добавьте поле с байтовым массивом closeTag, содержащим байты искомого корневого узла, который вы ищете.
Добавьте поле int с именем matchCount или что-то, инициализированное нулями.
Добавьте поле логического значения с именем underInputStreamNotFinished, инициализированное в true
В реализации read ():
- Проверьте, соответствует ли matchCount == closeTag.length, если это так, установите matchCount равным -1, верните -1
- Если matchCount == -1, установите matchCount = 0, вызывайте read () для базового входного потока, пока не получите -1 или '<' (объявление xml следующего документа в потоке) и не вернете его. Обратите внимание, что, насколько мне известно, спецификация xml допускает комментарии после элемента документа, но я знала, что не собираюсь получать это из источника, поэтому не стала обрабатывать ее - если вы не уверены, что вам нужно будет изменить " сожрать немного. </li>
- В противном случае читать int из базового входного потока (если он равен closeTag [matchCount], затем увеличивать matchCount, если он не сбрасывает matchCount в ноль) и возвращать вновь прочитанный байт
Добавить метод, который возвращает логическое значение того, закрылся ли основной поток.
Все чтения в базовом входном потоке должны проходить через отдельный метод, где он проверяет, является ли значение чтения -1, и, если это так, устанавливает поле "underInputStreamNotFinished" в false.
Возможно, я пропустил несколько незначительных моментов, но я уверен, что вы получите картину.
Затем в коде использования вы делаете что-то вроде, если вы используете xstream:
DocumentSplittingInputStream dsis = new DocumentSplittingInputStream(underlyingInputStream);
while (dsis.underlyingInputStreamNotFinished()) {
MyObject mo = xstream.fromXML(dsis);
mo.doSomething(); // or something.doSomething(mo);
}
David