什么是解析的“推送方法”和“拉方法”?
在推送解析方法下,推送解析器在解析文档时生成同步事件,这些事件可以由应用程序使用回调处理程序模型进行处理
这是关于SAX 2.0的Pro XML Development with Java一书中给出的文本。
至于StAX,书中说:
在 pull 方法下,事件在应用程序的控制下使用分析器从 XML 文档中提取。
我想问,突出显示的文本的含义是什么?适合初学者的答案是值得赞赏的:)
在推送解析方法下,推送解析器在解析文档时生成同步事件,这些事件可以由应用程序使用回调处理程序模型进行处理
这是关于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以回调函数的形式生成,如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 数据时才获取(拉取)它。
通过拉取分析,客户端控制应用程序线程,并可以在需要时调用解析器上的方法。相比之下,在推送处理中,解析器控制应用程序线程,客户端只能接受来自解析器的调用。