爲了適應推式解析器到一個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拉動推送數據的算法是沒有意義的,就像談論從輸出生成輸入的算法是沒有意義的。 –