在推送解析方法下,推送解析器会在文档生成同步事件时生成 已解析,并且应用程序可以使用回调处理程序模型
处理这些事件
这是关于SAX 2.0的 Pro XML Development with Java 一书中给出的文本。
至于StAX,这本书说:
在pull方法下,事件是在应用程序的控制下从XML文档中提取的 使用解析器。
我想问一下,突出显示的文字是什么意思?一个适合初学者的答案表示赞赏:)
答案 0 :(得分:33)
基本上,推送就是解析器对某个处理程序说“我有一个foo,用它做点什么”。拉动是当处理程序对解析器说,“给我下一个foo。”
推送:
if (myChar == '(')
handler.handleOpenParen(); // push the open paren to the handler
拉线:
Token token = parser.next(); // pull the next token from the parser
答案 1 :(得分:7)
推送解析器 - 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数据。
使用pull解析,客户端控制应用程序线程,并在需要时调用解析器上的方法。相比之下,使用推送处理,解析器控制应用程序线程,客户端只能接受解析器的调用。
答案 2 :(得分:1)
推送解析:它是解析器将解析事件推送到应用程序的地方,最常见的是使用回调方法。应用程序可以在调用任何解析器方法后异步处理,这样如果解析器花费时间app就不会卡在那一点上。解析完成后,解析器通过其回调事件将触发应用程序,以便应用程序可以进一步继续解析结果。
当应用程序提取数据而不是等待解析事件时,拉解析。应用程序可以根据需要逐个提取数据。就像在StAX中一样,app迭代地调用next()方法来获取XML中的下一个构造。