Tried to timing those two approaches and found that normal approach was slightly better that stream filter approach.
My input XML file has 8600 nodes and each node has 6 start elements & 6 end elements.
When i ran the below program, normal approach took ~133 ms and stream filter approach took ~139 ms.
public class StaxComparison {
public static void main(
String[] args) {
long start;
long avg = 0;
int i = 0;
while (i < 100) {
start = System.currentTimeMillis();
processFilterReader();
avg += System.currentTimeMillis() - start;
i++;
}
System.out.println(avg / 100);
}
public static void processReader(){
try{
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlr = xmlif.createXMLStreamReader(new FileInputStream("test.xml"));
while(xmlr.hasNext()){
xmlr.next();
switch(xmlr.getEventType()){
case XMLEvent.START_ELEMENT:
{
//System.out.println(xmlr.getLocalName());
}
break;
case XMLEvent.END_ELEMENT:
{
//System.out.println(xmlr.getLocalName());
}
break;
}
}
xmlr.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void processFilterReader(){
try{
XMLInputFactory xmlif = XMLInputFactory.newInstance();
XMLStreamReader xmlr = xmlif.createFilteredReader(
xmlif.createXMLStreamReader(new FileInputStream("test.xml")), new MyStreamFilter());
while(xmlr.hasNext()){
xmlr.next();
//System.out.println(xmlr.getLocalName());
}
xmlr.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
class MyStreamFilter implements javax.xml.stream.StreamFilter {
public boolean accept(XMLStreamReader reader) {
if (reader.isStartElement() || reader.isEndElement())
return true;
else
return false;
}
}
Siva