0

是否有可能/是否有一种简单的方法可以找到与 START_ELEMENT 对应的结束标记 (END_ELEMENT),如下所示?

while(reader.hasNext()){
        XMLEvent event = reader.nextEvent();

        if(event.getEventType() == XMLEvent.START_ELEMENT){
            StartElement startElement = event.asStartElement();
            System.out.println(startElement.getName().getLocalPart());
        }
    }
4

2 回答 2

1

如果您通过简单的方法调用返回结束元素,那么答案是否定的。SAX 解析器是基于事件的解析器,因此它会读取您的 XML 文件并创建事件。处理这些事件并在这些事件发生时建立您的记忆结构取决于您。

也许您应该使用一个 DOM 解析器,它在内存中构建 XML 结构并且您可以在其中导航。或者使用一些将 XML 转换为 java 对象的 xml bindig(例如 JAXB),反之亦然。

于 2013-02-28T20:31:25.413 回答
0

我能想到的最简单的方法是:

  • 创建一个StreamFilter具有内部深度计数器;它的accept方法将:
    • 每次有事件递增,每次有事件START_ELEMENT递减END_ELEMENT
    • true当且仅当深度为零时返回
  • 当您遇到特定的开始标签时,从FilterReader基于此过滤器的原始流中读取:

然后

    if(event.getEventType() == XMLEvent.START_ELEMENT){
        StartElement startElement = event.asStartElement();
        System.out.println(startElement.getName().getLocalPart());
        if (/* you want the end of this start tag */) {
          Reader forwardToMatchingEndReader = xmlInputFactory.createFilterReader(reader, filter)
          XMLEvent matchingEndEvent = forwardToMatchingEndReader.next();
        }
    }
于 2013-02-28T22:03:02.800 回答