StAX找到对应的结束标记?

时间:2013-02-28 20:02:28

标签: java xml stax

是否有可能/有一种简单的方法来查找与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());
        }
    }

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

然后

    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();
        }
    }