2010-07-27 68 views
0

我正在考慮將一堆數據存儲在XML文件中。每個文件都會包含關於不同元素的信息,例如聯繫人。現在我試圖根據一些信息檢索聯繫人,例如:查找所有居住在CA中的聯繫人。我如何搜索這些信息?我可以使用類似LINQ的東西嗎?我看到XElement,但它是否適用於多個XML文件。設計解決方案指南 - XML文件與數據庫

轉換爲數據集有幫助嗎?所以我想我應該有一個我的應用程序的構造函數,它將所有xml文件加載到數據集中,並對數據集執行查詢。如果這是一個好方法,有人可以指點我的例子/資源?

最重要的是這是一個很好的解決方案還是應該使用數據庫?我使用XML文件的原因是我需要擴展此解決方案,以便將來在後端層(業務邏輯,數據庫)中使用xquery,並且我認爲在xml文件中使用數據會有所幫助。

更新我已經在這裏的模式 - http://ideone.com/ZRPco

+2

數據庫用於存儲**數據,XML對於交換**數據非常有用 - 不是一回事。不要使用其他的目的... – 2010-07-27 21:16:45

+0

@marc_s +1好說! – Skilldrick 2010-07-27 21:22:35

+0

@ marc_2雖然我將其修改爲「管理數據」XML,或者任何格式都可以存儲數據。實際上做數據雖然可以得到...我認爲技術術語是「icky」;) – mezmo 2010-07-28 13:43:35

回答

1

你可以在你的事業中使用XML。只是爲了理解你的例子。

您可能在您的公司有1000名員工。 每位僱主可以有零個或多個聯繫人(如主要,二等等)。 因此每個僱員都可以擁有一個contacts.xml(基於Xml數據庫,如eXist,MarkLogic,Berkely等)。

例如) - 接觸。xml

一旦數據在Xml數據庫中。然後數據庫可以根據您想要的方面獲取所有排序細節。

喜歡通過郵編提取通訊錄,通過市,按名稱等

所有你需要的就是寫具體XQuery來挖掘數據爲您的要求。 (在MarkLogic Xml數據庫服務器的情況下)。在這個世界中使用的術語是分面瀏覽。

Xml數據庫旨在處理這些信息。將聯繫人視爲海量數據而不是行/列。

+0

我正在尋找的解決方案的類型.. XML數據庫。那麼從C#/ visual studio有沒有辦法解決這個問題?但感謝指針。我遇到麻煩的一件事是如何構建我的XML文件..我應該爲每個元組/實體創建一個單獨的文件,還是應該壓縮它們到一個獲得XML文件?來自我的體驗內容的 – satyajit 2010-07-29 17:46:50

+0

不需要單個數據。 Xml數據庫在詳細描述多個文檔時相當漂亮。 將它們分組在一個邏輯實體中進行存儲。但那是非常通用的。在我們的案例中,我們有大約50,000個記錄作爲單獨的內容。 內容被政策性質,權限,書籍,論文,標準等。 – kadalamittai 2010-07-29 23:43:17

3

如果你把數據庫中的數據,然後可以很容易地將它輸出爲XML。不要僅僅因爲你需要在XML中結束而從XML開始。如果你需要對數據進行查詢,那麼數據庫幾乎肯定是最好的選擇。

0

這聽起來像數據庫將是正確的解決方案。我在這裏看到的兩個要求是,您需要針對數據集運行某些類型的查詢,並且您需要它在某個點處使用XML。 SQL數據庫將能夠比XML文件處理複雜的查詢要好得多,同時您可以在需要時將數據轉換爲XML。

1

這裏有兩個原因不使用XML ......

  1. 如果數據集較大,我不會使用XML。您可以使用dom解析器(大數據速度慢)或sax解析器(速度更快,但在讀取整個文件之前,您將失去驗證功能)。

  2. 如果數據將要改變。您必須重寫整個xml文件才能更改其中的一部分。

這裏是我會使用XML的原因.. 如果數據集是小,自然是分層次的,並需要查看/編輯在文本編輯器。

如果需要輸出格式爲XML,它不是從一個數據庫輸出XML的一個問題。

0

按我的經驗,採用XML作爲主數據源是不是一個好主意,它會在某個時間點的疼痛。試試SQLite,它是一個功能強大且可移植的關係數據庫。

1

這裏有很多評論,沒有人對MarkLogic Server XML數據庫有太多的瞭解,以及在應用多種類型的索引(元素,值,屬性,xml結構,xml節點順序,詞,短語索引)

MarkLogic可以存儲/索引數十億的XML文檔,並允許亞秒在所有移動搜索,複雜SUM COUNT MIN MAX操作等

我已經用於關係的XML文件C#.NET LINQ到XML來實現原始海報想要實現的內容。 (無MarkLogic在這一點上,只是簡單的XML文件,並且將它們串聯在一起,實現C#LINQ代碼的任何類型的搜索我找的),你可能有接觸的XML文件:

<contacts> 
    <contact id="1" companyid="1"> 
    <name></name> 
    <address></address> 
    <city></city> 
    <state></state> 
    </contact> 
</contacts> 

您可能還想加入這個到另一個XML文件的公司:

<companies> 
    <company id="1"> 
    <name></name> 
    <address></address> 
    <city></city> 
    <state></state> 
    <company> 
</companies> 

下面是一些示例C#.NET的LINQ到XML的語法來實現做一個LEFT OUTER這兩個文件之間的連接:

using System.Xml.Linq.XDocument 

XDocument xDocContacts = XDocument.Load("contacts.xml"); 
XDocument xDocCompanies = XDocument.Load("companies.xml"); 

var results = from ct in xDocContacts.Root.Element("contacts").Elements("contact") 
       join cp in xDocCompanies.Root.Element("companies").Elements("company") 
       on ct.Attribute("companyid").Value.ToString() equals cp.Attribute("id").Value.ToString() 
       into joined 
       select joined.DefaultIfEmpty(); 
foreach (var item in joinedResults) 
{ 
} 

我使用了90MB的XML文件加入4-5MB的較小XML文件,並且可以在2-3秒範圍內使用多個WHERE條件執行復雜搜索。