2011-06-01 65 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