2013-02-28 8 views
0

Возможно ли/есть простой способ найти конечный тег (END_ELEMENT), соответствующий START_ELEMENT, как в следующем?StAX найти соответствующий тег?

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

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

ответ

1

Если вы имеете в виду простой способ получить вызов для возврата конечного элемента, то ответ будет отрицательным. Анализаторы SAX являются синтаксическими анализаторами на основе событий, поэтому они читают ваш XML-файл и создают события. Это зависит от вас, чтобы справляться с этими событиями и строить свою структуру памяти по мере появления этих событий.

Возможно, вам следует использовать парсер DOM, который создает структуру XML в памяти, и вы можете перемещаться по нему. Или используйте некоторый xml bindig (например, JAXB), который переводит XML в java-объекты и vica-versa.

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(); 
     } 
    } 
Смежные вопросы