【问题标题】:What is 'Push Approach' and 'Pull Approach' to parsing?什么是解析的“推送方法”和“拉取方法”?
【发布时间】:2013-03-31 11:32:20
【问题描述】:

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

这是Pro XML Development with Java 一书中关于 SAX 2.0 的内容。

至于 StAX,书上说:

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

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

【问题讨论】:

    标签: java xml saxparser stax


    【解决方案1】:

    基本上,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
    

    【讨论】:

    • 非常简单的答案,适合初学者。谢谢。
    【解决方案2】:

    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 数据。

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

    【讨论】:

    • 如果我理解正确的话,在 push 中所有的数据都会在没有程序员控制的情况下被移动到内存中。在拉动中,程序员可以控制要加载的内容和不加载的内容。 正确吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      相关资源
      最近更新 更多