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

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

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

至于StAX,这本书说:

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

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

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

推:

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

拉:

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

推送解析器 – 事件由API以回调函数的forms生成,如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数据。

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

推送解析:它是解析器将解析事件推送到应用程序的地方,最常见的是使用回调方法。 应用程序可以在调用任何解析器方法后异步处理,这样如果解析器需要时间app就不会停留在那一点上。 解析完成后,解析器通过其回调事件将触发应用程序,以便应用程序可以进一步继续解析结果。

pull解析:当app拉动数据而不是等待解析事件时。 应用程序可以根据需要逐个提取数据。 就像在StAX中一样,app迭代地调用next()方法来获取XML中的下一个构造。