私は同様の仕事をしていましたが、元の質問は1年以上前のものですが、満足のいく答えを見つけることができませんでした. これまでで最も興味深い回答は Blaise Doughan の回答でしたが、期待している 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>
'