2013-04-09 13 views
21

在推解析方法中,推解析器產生同步事件的原稿 解析,並且這些事件可以由一個應用程序使用回調處理程序模型什麼是「推送法」和「拉法」來解析?

這是在給定的文本進行處理book 關於SAX 2.0的Pro XML開發與Java

至於StAX的,書上說:

在拉方法,事件從XML文檔使用的解析器的應用 的控制下拉出。

我想問一下,突出顯示的文字是什麼意思?一個適合初學者的答案是讚賞:)

回答

28

基本上,當解析器對某個處理程序說「我有一個foo,對它做些什麼」的時候,就是一個推動。當處理程序對解析器說:「給我下一個foo」。

推送:

if (myChar == '(') 
    handler.handleOpenParen(); // push the open paren to the handler 

拉:

Token token = parser.next(); // pull the next token from the parser 
+1

非常簡單的回答適合初學者。謝謝。 – Keerthivasan 2015-02-26 05:58:09

7

推解析器 - 事件是由API生成的回調函數形式,如startDocument(),endDocument(),並且不受程序員控制。我們作爲程序員可以處理事件,但事件的發生是無法控制的。

拉解析器 - 當我們調用某些API時會生成事件。示例如下所示。 所以我們作爲程序員可以決定何時生成事件。

int eventType = xmlr.getEventType(); 
while(xmlr.hasNext()){ 
    eventType = xmlr.next(); 
    //Get all "Book" elements as XMLEvent object 
    if(eventType == XMLStreamConstants.START_ELEMENT && 
     xmlr.getLocalName().equals("Book")){ 
     //get immutable XMLEvent 
     StartElement event = getXMLEvent(xmlr).asStartElement(); 
     System.out.println("EVENT: " + event.toString()); 
    } 
} 

,客戶端只得到(拉)XML數據時,它確實需要它。

使用拉解析,客戶端控制應用程序線程,並可以在需要時調用解析器上的方法。相比之下,通過推送處理,解析器控制應用程序線程,客戶端只能接受來自解析器的調用。

+1

如果我理解正確的,在推的所有數據將被移動到存儲器中,而程序員的控制。在pull中,程序員可以控制要加載的內容以及不加載的內容。 *正確嗎?* – 2013-04-09 07:02:07

+1

是的..你的理解是正確的。 – JRR 2013-04-09 07:05:41

1

推送解析:它是解析器將解析事件推送到應用程序的地方,最有可能使用回調方法。在調用任何解析器方法之後,應用程序可以異步處理,這樣如果解析器需要時間,應用程序就不會停留在該點上。解析完成後,解析器通過其回調事件將觸發應用程序,以便應用程序可以繼續解析結果。

拉解析:當應用程序拉數據,而不是等待解析事件。根據需求,應用程序可以逐一的方式提取數據。就像在StAX中一樣,app通過iteretively調用next()方法來獲取XML中的下一個構造。