2011-04-29 77 views
1

我有一個xml文件和一個定義的dtd。我對sax解析器的理解是它處理事件而不是將整個xml文檔(如DOM)存儲在內存中。說,我有一個聲明像<名稱的XML文件> ...//這裏有大約200萬行< /名稱>。那麼,在這種情況下,薩克斯分析器將存儲在內存中?它如何知道終端標籤名稱將會出現。現在真正的問題是,薩克斯解析器如何驗證dtd?我不是在尋找深入的解釋,而只是關於驗證如何發生的一般想法。薩克斯解析器如何驗證dtd?

回答

2

通常將DTD轉換爲一組有限狀態自動機 - 有一個標準算法用於將BNF語法轉換爲編譯器教科書(如Aho和Ullmann)中的確定性FSA。這將爲每個元素的內容模型生成一個FSA。解析/驗證的當前狀態因此由每個打開元素保持一個FSA(具有其當前狀態)的堆棧表示。當解析器遇到開始標記時,它會檢查該開始標記是否代表最高FSA中的有效轉換,並通過進行該轉換來更改該FSA中的當前狀態;它還將新的FSA添加到與新元素的內容模型的FSA相對應的堆棧中。當它看到一個結束標記時,它會檢查最上面的FSA的當前狀態是否是最終狀態,並將此FSA從堆棧中彈出。