2013-01-13 62 views
1

我有一個程序請求網頁,解析它並依賴於結果決定下一步該做什麼。解析器的設計模式

例如:程序應該從頁面獲取一些元素,我們稱它爲「目標元素」。如果程序確實請求並獲取「someOtherElement」,它將繼續執行。如果它獲得「aimElement」執行者應該點擊一些鏈接,執行結束,我們去下一個任務。程序有20次嘗試獲得「aimElement」。 「aimElement」可能會在未來發生變化。

看起來很簡單,但我真的不知道如何實現這個良好的oo設計。我在考慮兩個對象:Task和Executor。任務包含所有條件,Executor將Task作爲參數接收,並根據Task的需求進行請求。但是,如果執行者將原始頁面返回給任務本身,任務將變得複雜,並且它們之間將存在強大的連接。如果Executor返回已經解析過的頁面元素,那麼Executor將需要知道什麼以及如何解析,並且也會很複雜,並且還會有強大的連接。

我不知道我的解釋是否清楚,但也許你可以給我建議一些設計模式,或只是分享你的經驗與類似的問題。

+0

Yust要確保 - 你想解析一個HTML文檔並找到某些節點? – home

+0

XML內容HTML。在XML中,如果找到它,我會搜索包含元素的節點,然後找到包含HTML和解析鏈接的節點,然後單擊它們。 – Moses

回答

2

我只是使用推送解析器,並允許任務註冊自己感興趣的任何事件。基本上,您的解析器解析文檔一次,並通知所有訂閱者他們感興趣的事情類型(比如說「img with URL X「或」鏈接到Y「)。

然後,您可以查詢訂閱者以查看接下來要做什麼(在每個事件結束時/之後),或讓他們自己通過偵聽器方法通知您。

最好的部分是我確定在Java中已經有了一個HTML解析器,所以你可以避免一些工作。

+1

+1這聽起來像你想做摩西。你可以使用像SAX解析器(內置於Java)那樣簡單的東西。如果你確實需要實現解析器的完整棧,你可能會對[責任鏈模式](http://en.wikipedia.org/wiki/Chain-of-responsibility_pattern) –

+0

有興趣。但是如果「aimElement」發生變化,我將不得不編寫新的Task類並對Executor進行更改。有沒有一種方法可以讓我不能碰到口語課? – Moses

+0

@摩西你爲什麼要碰觸執行者?最簡單的方法:1.您所有的任務註冊他們感興趣的事件。2.解析文檔。 3.查詢你的任務來決定下一步該做什麼(這可能像「給我所有我應該訪問的URL」方法一樣簡單;如果這個集合是空的,你就完成了) - 這可以用它自己提取如果您以後可能需要更改,也是一樣。 – Voo