2009-06-16 79 views
1

我有以下一組數據什麼是數據結構如下一個更好的選擇:詞典<字符串,字典<字符串,字符串>>

<ids> 
    <id1 attr1="value1" attr2="value2" /> 
    <id2 attr3="value3" attr4="value4" /> 
    <id3 attr2="value6" attr5="value7" /> 
</ids> 

。基本上,它是一種可以與任何節點名稱的XML任何具有任何屬性值的屬性名稱。

解析XML後,我將屬性數據存儲在Dictionary中。 然後我將該字典存儲爲一個值,並將節點名稱作爲關鍵字。所以我的數據結構將是一個字典<字符串,字典<字符串,字符串> >(讓我們給這個變量名叫做「dict」) 因此,如果我想要在id1節點中獲取attr2的值,我會做:

string value = dict["id1"]["attr2"]; 
// value will be value2 

我覺得這是我需要一個非常簡單的和可行的解決方案,但只是似乎是這樣的聲音在我的後腦勺告訴我,有不同的數據結構或簡單的解決辦法,我錯過了。大家怎麼想?

+0

你需要存儲的任何原因字典中的數據?你有沒有部署.NET 3.5? – Kev 2009-06-16 17:32:21

+0

您可能希望在此結構的頂部添加一個自定義類以獲取某些類型檢查 – 2009-06-16 17:33:49

+0

Kev:除了第一個想到的數據結構是字典以外,沒有任何必要,因爲這些鍵是唯一的。是的,我在.NET 3.5上 克里斯:這並不是真的有必要,因爲所有的值都是字符串,但需要考慮。 – Klaw 2009-06-16 17:38:36

回答

5

我認爲你的解決方案是一個很好的解決方案。它將提供非常快速的查找,並且與您的域完全匹配。

是嵌套字典的主要問題?如果是這樣,我建議你不要擔心 - 使用集合集合通常是一個非常有用的工具。

我唯一的抱怨是這樣的:如果你不經常使用它,你將會把很多信息加載到一個可能沒有意義的數據結構中。如果這是一次性查找,將其留在XML中,並且使用XPath查詢可能比預先解析並將整個內容加載到內存中更加優化。如果您經常查詢,這是一個更優化的解決方案。

1

只要所有的節點都有唯一的名字,你應該沒問題。請注意,它不會真的對XML的工作是這樣的:

<nodes> 
    <node id="id1" attr1="value1" attr2="value2" /> 
    <node id="id2" attr3="value3" attr4="value4" /> 
    <node id="id3" attr2="value6" attr5="value7" /> 
</nodes> 
+1

在這種情況下,最好使用List >,因爲在節點名稱中沒有唯一性。 – Joseph 2009-06-16 17:34:24

0

考慮到XML可以有任何節點名稱和任何屬性的名字,我認爲你目前的解決方案是最佳的。

2

XML看起來不太好。它根本不是語義XML。語義XML將是:

<data> 
    <item id="id1"> 
     <value name="attr1">value1</value> 
     <!-- ... --> 
    </item> 
    <!-- ... --> 
</data> 

我知道它更大,但這是XML的。我甚至會這樣說的原因是,如果你還沒有準備好使用語義XML,那麼你可能正在尋找另一種數據格式。 XML本質上有點臃腫。如果你正在尋找一個緊湊的格式,看看JSON

無論如何,使用語義XML,我會推薦XPath。查看MSDN文檔並查看DOM對象中的SelectNodes方法。

短的例子:

XmlDocument doc = new XmlDocument(); 
doc.Load("data.xml"); 

// Get a single item. 
XmlNode item = doc.SelectSingleNode("//item[@id=myid]"); 
+0

您在語義XML上做了一個好點。回顧我的XML示例,它確實缺乏其他人可能無法識別的語義信息。我會考慮改進它。 – Klaw 2009-06-16 17:52:07

2

只是爲了咧嘴笑 - 如果您保留了XML DOM並通過XPath查詢找到了您的屬性,該怎麼辦?這樣,如果你有重複的節點名稱,你可以適應。

0

如果您需要XML語法,請根據需要創建一個。如果你需要一個解析器,然後使用.Net庫中提供的許多優秀解析器之一。如果您需要將文檔存儲在內存中並訪問它,請使用DOM和XPath選擇節點。如果你不需要這些,那麼我會建議不要使用XML,而應該使用像JSON這樣簡單的東西。

如果您需要將整個事物保留在內存中,但只是值,那麼我建議使用DataSet並將它們與XML加載器一起加載。

3

上課怎麼樣?

public class YourId 
{ 
    public string Id { get; set; } 
    public string Attribute1 { get; set; } 
    public string Value { get; set; } 
} 

然後,你可以創建一個列表,並通過你的XML ... 填充它這將是容易的工作,你可以使用LINQ它:

List<YourId> items = GetIdsFromXml(); 

var query = from i in items 
      where i.Id == "id1" 
      select i; 

// or... 

items.Where(i => i.Attribute == "blah").ToList(); 

// ect. 
相關問題