2010-07-26 230 views
0

我需要設計一個駐留在組織內部網中的Windows應用程序。應用程序將部署在用戶的計算機上,用戶將在具有預定義模式的XML文件中生成輸出。該XML將被寫出到其他用戶可以訪問的聯網文件夾中。這些文件被命名爲userid_output.xml。 「userid」是從應用程序環境中提取的。在使用應用程序時,用戶應該有能力搜索由用戶範圍生成的所有XML直到該點。檢索到的信息將驅使用戶塑造他/她的應用程序輸入。一個非常堅定的要求是不要使用任何RDBMS(Oracle/Sql Server/MySql等)來存儲XML。共享網絡文件夾爲「THE REPOSITORY」,僅用於存儲XML。承載共享文件夾的計算機可能不運行任何可能有助於索引XML或優化用於搜索目的的數據的服務。在共享文件夾中的XML文件中快速搜索

鑑於這些限制,是否有人知道任何設計技術/工具/機制來從這個「數據集」中執行快速信息檢索?

謝謝

+0

這聽起來像一些非常可怕的要求。我們是否理解,重點是要解析通過磁盤上不可識別的XML文件的方式,以最快的方式執行搜索,而不進行任何索引? – StriplingWarrior 2010-07-26 15:10:41

+1

如果我受到這樣的限制,我會說再見,解釋說如果沒有交易工具,我就無法完成工作。 – Oded 2010-07-26 15:12:03

+0

另一種方式是想以某種方式選擇性地在客戶端網站上提取XML並在內存中執行搜索,但是如果> 2000用戶每天都輸出GBytes數據的數據,則此方法會以相當快的速度失敗。 – 2010-07-26 15:20:10

回答

1

您可以使用XQuery。 collection()函數允許您查詢XML文件的目錄。

這裏是一個使用撒克遜的例子。 (我不知道是否有其他的實現將是一樣的。):

collection("file:///C:/sample_xml?select=*.xml;")

這將在C:\sample_xml目錄中選擇所有的* .xml文件中。

您還可以通過使用XPath縮小結果:

collection("file:///file://///srv1/dir1/sample_xml?select=*.xml;")/doc/sample1[@id='someID']

這將只返回sample1元素有一個屬性id這等於someID

+0

謝謝。我以前沒有使用XQuery的經驗,但是在上面的代碼片段中,您是使用collection()在存儲在客戶機器上的C:\ sample_xml目錄中形成xml文件的內存中表示形式的?如果我們有7000個sample.xml文件,並且只對標籤的屬性id等於「someId」的值感興趣,會發生什麼?XQuery如何幫助以優化的方式返回子集而不會造成巨大的開銷? – 2010-07-26 18:21:53

+0

XQuery與Linq2Xml有什麼不同? – 2010-07-26 18:22:29

+0

@sc_ray - 對不起,我沒有使用Linq2Xml的經驗。我會在我的答案中再增加一個例子來說明我將如何縮小結果。 – 2010-07-26 19:36:29