【发布时间】:2013-03-31 11:32:20
【问题描述】:
在推送解析方法下,推送解析器生成同步事件,因为文档是 解析后,这些事件可以由应用程序使用回调处理程序模型进行处理
这是Pro XML Development with Java 一书中关于 SAX 2.0 的内容。
至于 StAX,书上说:
在拉取方法下,事件从应用程序控制下的 XML 文档中拉取 使用解析器。
我想问一下,突出显示的文字是什么意思?适合初学者的答案表示赞赏:)
【问题讨论】:
在推送解析方法下,推送解析器生成同步事件,因为文档是 解析后,这些事件可以由应用程序使用回调处理程序模型进行处理
这是Pro XML Development with Java 一书中关于 SAX 2.0 的内容。
至于 StAX,书上说:
在拉取方法下,事件从应用程序控制下的 XML 文档中拉取 使用解析器。
我想问一下,突出显示的文字是什么意思?适合初学者的答案表示赞赏:)
【问题讨论】:
基本上,push 是解析器对某个处理程序说:“我有一个 foo,用它做点什么”。拉动是处理程序对解析器说“给我下一个 foo”。
推:
if (myChar == '(')
handler.handleOpenParen(); // push the open paren to the handler
拉:
Token token = parser.next(); // pull the next token from the parser
【讨论】:
Push Parsers - 事件由 API 以回调函数的形式生成,例如 startDocument()、endDocument(),并且不受程序员的控制。作为程序员,我们可以处理事件,但事件的产生是无法控制的。
Pull Parsers - 当我们调用某些 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 数据。
通过拉解析,客户端控制应用程序线程,并且可以在需要时调用解析器上的方法。相比之下,通过推送处理,解析器控制应用程序线程,客户端只能接受来自解析器的调用。
【讨论】:
推送解析:解析器将解析事件推送到应用程序的地方,很可能使用回调方法。应用程序可以在调用任何解析器方法后进行异步处理,这样如果解析器花费时间,应用程序就不会卡在那个点上。一旦解析完成,解析器会通过其回调事件触发应用程序,以便应用程序继续解析结果。
拉解析:当应用拉取数据而不是等待解析事件时。 App可以根据自己的需求,一张一张的拉取数据。就像在 StAX 中一样,应用程序反复调用 next() 方法以获取 XML 中的下一个构造。
【讨论】: