为了适应推式解析器到一个pull语法分析器中,您必须收集几个(全部?取决于正在分析的内容以及被推入的元素的顺序)到Event
对象中。然后允许那些Event
被拉。
我们可以使用XML作为示例,并将SAXHandler调整为StAX解析器。我们还必须实现用于迭代StAX XMLEvent
的XMLStreamReader方法。
我从来没有使用StAX,但它看起来像将当前状态存储在XMLStreamReader
对象中。每次调用reader.next()
更新状态,并从reader.getName()
和reader.getText()
等等返回的值相应更新。
我们可以通过几种方法从先分析内存中的所有内容开始,然后迭代我们存储在内存中的内容,再到更复杂的技术,例如使用多线程分析XML并阻止读取下一个标记,直到用户呼叫next()
。
为了简单起见,我将只是显示在内存中StAX的方法存储的一切现在
class SAXHandler extends DefaultHandler implements XMLSTreamReader {
//Stax Event objects
List<XMLEvent> events = new ArrayList<>;
int counter=0;
//Stax current tag name and text data updated with calls to next()
private String name, text;
@Override
//Triggered when the start of tag is found.
public void startElement(String uri, String localName,
String qName, Attributes attributes)
throws SAXException {
//create a new XMLEvent for the start of the new tag
XMLEvent newEvent = ....
events.add(newEvent);
}
//other SAX methods implemented similarly
...
:
@Override
public XMLEvent next(){
if(!hasNext()){
throw NoSuchElementException();
}
counter++;
XMLEvent next =events(counter);
//update our content
this.name = next.name;
this.text = next.text;
...
return next;
}
@Override
public boolean hasNext(){
return counter < events.size();
}
...
@Override
public String getName(){
return name;
}
@Override
public String getText(){
return text;
}
}
希望这有助于
我不完全明白你在问,但我最初的想法是推拉术语只是定义。算法总是接受输入并产生输出。所以在这种情况下,从数据流中提取并推入令牌的反面会拉动令牌并推送数据流。 AFAIK拉动推送数据的算法是没有意义的,就像谈论从输出生成输入的算法是没有意义的。 –