什么是解析的“推送方法”和“拉方法”?

2022-09-01 05:50:46

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

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

至于StAX,书中说:

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

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


答案 1

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

推:

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

拉:

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

答案 2

推送解析器 - 事件由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 数据时才获取(拉取)它。

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


推荐