什么是“推式解析”和“拉式解析”?

42
在推式解析方法下,推式解析器会生成同步事件来解析文档,应用程序可以使用回调处理程序模型来处理这些事件。
这是有关SAX 2.0的书籍《Java与XML开发实战》中给出的文本。
至于StAX,该书表示:
在拉取方法下,应用程序通过解析器控制从XML文档中拉取事件。
我想问一下,突出显示的文本是什么意思?欢迎提供适合初学者的答案 :)
4个回答

59

基本上,推送(push)是当解析器(parser)告诉某个处理程序(handler),"我有一个 foo,请对其进行处理。"时发生的。拉取(pull)是当处理程序(handler)告诉解析器(parser),"给我下一个 foo。"时发生的。

Push:

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

拉:

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

3
非常简单的答案适合初学者。谢谢。 - Keerthivasan

12

推式解析器 - 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
如果我理解正确,在推送中所有数据将被移动到内存中,而不受程序员的控制。在拉取中,程序员可以控制加载什么和不加载什么。正确吗? - An SO User

6

推式解析: 在这种解析方式中,解析器通过回调方法将解析事件推送到应用程序中。应用程序在调用任何解析器方法后可以异步处理,以使得当解析器需要时间时,应用程序不会停滞在该点上。一旦解析完成,解析器将通过其回调事件触发应用程序,以便应用程序可以进一步处理解析结果。

拉式解析: 当应用程序沿着数据流推进时,而不是等待解析事件时,就是拉式解析。应用程序可以按照自己的需求逐个拉取数据,例如在StAX中,应用程序通过反复调用next()方法来获取XML中的下一个构造。


2
你可以这样说,在推送解析中,解析器启动数据流,而在拉取解析中,应用程序启动数据流。
因此,拉取解析器模型更经济实惠:只有在需要数据时,你的应用才会获取数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接