【问题标题】:StAX EventFilter StackOverflowErrorStAX EventFilter StackOverflowError
【发布时间】:2011-06-01 16:31:51
【问题描述】:

我有这个 EventFilter 实现,它应该过滤 <InterestingElement> 开始元素事件:

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)

如果有人知道问题所在,我将不胜感激。

【问题讨论】:

  • 你最终发现了什么?如果它仍然是一个谜,您可能想要显示更多堆栈 - 或总结,例如,......“随后是 2000 多个 EventFilterSupport.peek()”调用。从简短的摘录中不清楚过度递归在哪里。

标签: java xml stax


【解决方案1】:

我无法重现您的问题,以下基于您的描述对我有用。我错过了你的问题吗?:

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>

【讨论】:

  • 我相信你错过了一个事实,即我正在处理一个稍微大一点的文件,比如说,从几百 Mb 到几 Gb。
  • @adrianboimvaser - 您的过滤器是否适用于较小的文档(您的问题未提及文件大小)?
  • 是的,确实如此。抱歉没有提及。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多