36

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

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

至于 StAX,这本书说:

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

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

4

4 回答 4

53

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

推:

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

拉:

Token token = parser.next(); // pull the next token from the parser
于 2013-04-09T06:57:15.353 回答
11

Push Parsers - 事件由 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 数据。

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

于 2013-04-09T06:55:38.530 回答
5

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

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

于 2013-04-09T06:56:02.213 回答
1

您可以说,在推送解析中,解析器启动数据流,而在拉解析中,应用程序启动数据流。

因此,拉解析器模型非常经济:您的应用程序仅在需要时获取数据。

于 2022-02-17T19:26:41.270 回答