XMLEventSubReader

XMLStreamReader改のXMLEventReader版を作ってみた。

import javax.xml.stream.util.EventReaderDelegate; 
import javax.xml.stream.events.XMLEvent; 
import javax.xml.stream.XMLStreamException; 
import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLStreamConstants; 
 
public class XMLEventSubReader extends EventReaderDelegate { 
    protected String targetNode; 
    protected boolean breakTargetNode; 
    protected int countTargetNode; 
    protected XMLEvent currentEvent; 
 
    public XMLEventSubReader(XMLEventReader delegateReader,XMLEvent event) { 
        super(delegateReader); 
        this.currentEvent = event; 
        if(currentEvent.isStartElement()){ 
            this.targetNode = currentEvent.asStartElement().getName().getLocalPart(); 
        }else{ 
            this.targetNode = null; 
        } 
        this.breakTargetNode = false; 
    } 
 
    @Override 
    public boolean hasNext() { 
        if ( this.breakTargetNode) { 
            return false; 
        } else { 
            return this.getParent().hasNext(); 
        } 
    } 
 
    @Override 
    public XMLEvent nextEvent() throws XMLStreamException { 
 
        if(currentEvent.isStartElement()){ 
            if ( currentEvent.asStartElement().getName().getLocalPart().equals(this.targetNode)) { 
                countTargetNode++; 
                this.breakTargetNode = false; 
            } 
        }else if(currentEvent.isEndElement()){ 
 
            if ( currentEvent.asEndElement().getName().getLocalPart().equals(this.targetNode)) { 
                countTargetNode--; 
                this.breakTargetNode = (countTargetNode == 0); 
            } 
        }else if(currentEvent.isEndDocument()){ 
 
            this.breakTargetNode = true; 
 
        } 
        currentEvent = this.getParent().nextEvent(); 
 
        return currentEvent; 
    } 
 
    public XMLEvent currentEvent(){ 
        return currentEvent; 
    } 
 
} 

テストコードはこんな感じ。

import javax.xml.stream.XMLStreamReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.events.XMLEvent; 
import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
 
 
public class Tester { 
 
    private static final String fileName = "D:\\kuro\\nova\\nova-xml\\classes\\test.xml"; 
 
    public static void main(String[] args) throws Exception{ 
         
 
        // 入力ファクトリを取得する 
        XMLInputFactory xmlif = XMLInputFactory.newInstance(); 
 
        BufferedInputStream stream = new BufferedInputStream(new FileInputStream(fileName)); 
         
        XMLEventReader reader = xmlif.createXMLEventReader(stream); 
        while(reader.hasNext()){ 
            xe = reader.nextEvent(); 
            if(xe.isStartElement()){ 
                if("b".equals(xe.asStartElement().getName().getLocalPart())){ 
                    XMLEventSubReader subReader = new XMLEventSubReader(reader,xe); 
                    for(;subReader.hasNext();subReader.nextEvent())  { 
 
                        //カレントノードのサブツリーのみを処理 
                        if(subReader.currentEvent().isStartElement()){ 
                            System.out.println("sub:" + subReader.currentEvent().asStartElement().getName().getLocalPart()); 
                        }else if(subReader.currentEvent().isEndElement()){ 
                            System.out.println("sub:" + subReader.currentEvent().asEndElement().getName().getLocalPart()); 
                        } 
 
                    } 
                } 
 
            } 
        } 
 
 
    } 
}