2013-02-28 71 views
0

是否可以/是否有一種簡單方法來查找與START_ELEMENT對應的結束標記(END_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轉換爲java對象的xml bindig(例如JAXB),反之亦然。

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