什么是"推动方法"和"拉动方法"来解析?

Lit*_*ild 25 java xml stax saxparser

在推送解析方法下,推送解析器在解析文档时生成同步事件,并且应用程序可以使用回调处理程序模型处理这些事件

这是关于SAX 2.0的Pro XML Development with Java一书中给出的文本.

至于StAX,这本书说:

在pull方法下,使用解析器在应用程序的控制下从XML文档中提取事件.

我想问一下,突出显示文本的含义是什么?一个适合初学者的答案表示赞赏:)

ysh*_*vit 35

基本上,推送就是解析器对某个处理程序说"我有一个foo,用它做点什么".拉动是当处理程序对解析器说,"给我下一个foo."

推:

if (myChar == '(')
    handler.handleOpenParen(); // push the open paren to the handler
Run Code Online (Sandbox Code Playgroud)

拉:

Token token = parser.next(); // pull the next token from the parser
Run Code Online (Sandbox Code Playgroud)

  • 适合初学者的非常简单的答案。谢谢你。 (2认同)

JRR*_*JRR 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());
     }
} 
Run Code Online (Sandbox Code Playgroud)

,客户端只在明确要求时获取(拉取)XML数据.

通过pull解析,客户端控制应用程序线程,并在需要时调用解析器上的方法.相反,使用推送处理,解析器控制应用程序线程,客户端只能接受来自解析器的调用.


Ank*_*kit 6

推送解析:解析器将解析事件推送到应用程序,最有可能使用回调方法。应用程序可以在调用任何解析器方法后异步处理,这样,如果解析器需要时间,应用程序就不会卡在此时。一旦解析完成,解析器将通过其回调事件触发应用程序,以便应用程序可以进一步继续解析结果。

拉解析:当应用程序拉取数据而不是等待解析事件时。App可以根据自己的需求,一一拉取数据。与 StAX 中一样,应用程序迭代调用 next() 方法以获取 XML 中的下一个构造。