【问题标题】:StAX find Corresponding End Tag?StAX 找到相应的结束标签?
【发布时间】:2013-02-28 20:02:27
【问题描述】:

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

【问题讨论】:

    标签: java xml stax


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      • 创建一个具有内部深度计数器的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();
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2022-08-13
        • 1970-01-01
        • 2012-08-20
        • 1970-01-01
        • 2019-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多