У меня была похожая задача, и хотя первоначальный вопрос был старше года, я не смог найти удовлетворительного ответа.Самым интересным ответом до сих пор был ответ Блеза Дафана, но я не смог запустить его на ожидаемом XML (может быть, некоторые параметры для базового синтаксического анализатора могли бы изменить это?).Вот XML, очень просто:
<many-many-tags>
<description>
...
<p>Lorem ipsum...</p>
Devils inside...
...
</description>
</many-many-tags>
Мое решение:
public static String readElementBody(XMLEventReader eventReader)
throws XMLStreamException {
StringWriter buf = new StringWriter(1024);
int depth = 0;
while (eventReader.hasNext()) {
// peek event
XMLEvent xmlEvent = eventReader.peek();
if (xmlEvent.isStartElement()) {
++depth;
}
else if (xmlEvent.isEndElement()) {
--depth;
// reached END_ELEMENT tag?
// break loop, leave event in stream
if (depth < 0)
break;
}
// consume event
xmlEvent = eventReader.nextEvent();
// print out event
xmlEvent.writeAsEncodedUnicode(buf);
}
return buf.getBuffer().toString();
}
Пример использования:
XMLEventReader eventReader = ...;
while (eventReader.hasNext()) {
XMLEvent xmlEvent = eventReader.nextEvent();
if (xmlEvent.isStartElement()) {
StartElement elem = xmlEvent.asStartElement();
String name = elem.getName().getLocalPart();
if ("DESCRIPTION".equals(name)) {
String xmlFragment = readElementBody(eventReader);
// do something with it...
System.out.println("'" + fragment + "'");
}
}
else if (xmlEvent.isEndElement()) {
// ...
}
}
Обратите внимание, что извлеченный фрагмент XML будет содержать полныйизвлеченный контент тела, включая пробелы и комментарии.Фильтрация по требованию или параметризация размера буфера были исключены для краткости кода:
'
<description>
...
<p>Lorem ipsum...</p>
Devils inside...
...
</description>
'