2011-06-01 38 views
1

我有一個是應該過濾<InterestingElement>開始元素事件,此EventFilter實現:StAX的EventFilter的StackOverflowError

class InterestingElementFilter implements EventFilter { 
    @Override 
    public boolean accept(XMLEvent event) 
    { 
     if (event.isStartElement()) { 
      StartElement startElement = event.asStartElement(); 
      String name = startElement.getName().getLocalPart(); 
      if (name.equals("InterestingElement")) { 
       return true; 
      } 
     } 
     return false; 
    } 
} 

然後,我創建一個過濾的讀者:

XMLEventReader interestingElementReader = xmlInputFactory.createFilteredReader(xmlEventReader, new InterestingElementFilter()); 

當調用

startElementReader.peek(); 

我得到這個:

java.lang.StackOverflowError 
at com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.seekCloseOfStartTag(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) 
at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(Unknown Source) 
at com.sun.xml.internal.stream.XMLEventReaderImpl.peek(Unknown Source) 
at javax.xml.stream.util.EventReaderDelegate.peek(Unknown Source) 
at com.sun.xml.internal.stream.EventFilterSupport.peek(Unknown Source) 
at com.sun.xml.internal.stream.EventFilterSupport.peek(Unknown Source) 
at com.sun.xml.internal.stream.EventFilterSupport.peek(Unknown Source) 
at com.sun.xml.internal.stream.EventFilterSupport.peek(Unknown Source) 

如果有人知道問題是什麼,我將不勝感激。

+0

你最終想到了什麼?如果它仍然是一個謎,你可能想要展示更多的堆棧 - 或者總結,例如......「,然後是2000個」EventFilterSupport.peek()「調用。目前還不清楚哪些過度遞歸是來自簡短的摘錄。 – 2011-08-03 15:49:12

回答

2

我還沒有能夠重現您的問題,以下根據您的描述爲我工作。我錯過了從你的問題?:

InterestingElementFilter

import javax.xml.stream.EventFilter; 
import javax.xml.stream.events.StartElement; 
import javax.xml.stream.events.XMLEvent; 

class InterestingElementFilter implements EventFilter { 

    public boolean accept(XMLEvent event) 
    { 
     if (event.isStartElement()) { 
      StartElement startElement = event.asStartElement(); 
      String name = startElement.getName().getLocalPart(); 
      if (name.equals("InterestingElement")) { 
       return true; 
      } 
     } 
     return false; 
    } 

} 

演示東西

import java.io.FileInputStream; 

import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.events.XMLEvent; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory(); 
     XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream("input.xml")); 
     InterestingElementFilter filter = new InterestingElementFilter(); 
     XMLEventReader interestingElementReader = xmlInputFactory.createFilteredReader(xmlEventReader, filter); 

     while(interestingElementReader.hasNext()) { 
      XMLEvent xmlEvent = interestingElementReader.peek(); 
      if(xmlEvent.isStartElement()) { 
       System.out.println(xmlEvent.asStartElement().getName()); 
      } 
      interestingElementReader.next(); 
     } 
    } 

} 

的input.xml

<?xml version="1.0" encoding="UTF-8"?> 
<root> 
    <InterestingElement> 
     <child>Hello World</child> 
    </InterestingElement> 
</root> 
+0

我相信你錯過了我正在處理一個稍大一點的文件,比如從幾百MB到幾個GB。 – adrianboimvaser 2011-06-08 14:55:55

+1

@adrianboimvaser - 您的過濾器是否適用於較小的文檔(您的問題沒有提及文件大小)? – 2011-06-08 15:36:41

+0

是的,它的確如此。對不起,不提。 – adrianboimvaser 2011-06-13 13:37:15