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)
推送解析器 - 事件由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解析,客户端控制应用程序线程,并在需要时调用解析器上的方法.相反,使用推送处理,解析器控制应用程序线程,客户端只能接受来自解析器的调用.
推送解析:解析器将解析事件推送到应用程序,最有可能使用回调方法。应用程序可以在调用任何解析器方法后异步处理,这样,如果解析器需要时间,应用程序就不会卡在此时。一旦解析完成,解析器将通过其回调事件触发应用程序,以便应用程序可以进一步继续解析结果。
拉解析:当应用程序拉取数据而不是等待解析事件时。App可以根据自己的需求,一一拉取数据。与 StAX 中一样,应用程序迭代调用 next() 方法以获取 XML 中的下一个构造。