2009-06-16 24 views
1

は、私は基本的には、それが持つ任意のノード名を持つことができますXMLデータ次のようなデータ構造へのより良い代替情報:辞書<文字列、辞書<文字列、文字列>>

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

の次のセットだてきました任意の属性値を持つ任意の属性名

XMLを解析した後、属性データを辞書に格納します。 次に、ノード名をキーにした値として同じ辞書を保存します。 私のデータ構造は、辞書<文字列、辞書<文字列、文字列> >(これは "dict"と呼ばれる変数名を与えよう) だから私はid1ノードでattr2の値を取得したいと思ったら、 :

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

私はこれが私のニーズのための非常にシンプルかつ実行可能な解決策だと思うが、ちょうどそのI異なるデータ構造や簡単な解決策があることを私に言って、私の頭の後ろにこの声があるように思われます私は行方不明です。誰もが何を考えているのですか?

+0

あなたが保存する必要が何らかの理由辞書のデータですか? .NET 3.5が導入されましたか? – Kev

+0

この構造体の上にカスタムクラスを追加して、ある種の型チェックを行うことができます。 –

+0

Kev:キーが一意であるため、最初のデータ構造が辞書であった点を除いては、何も必要ありません。はい、私は.NET 3.5です。 Chris:値はすべて文字列であることが予想されるので、現時点では必ずしも必要ではありませんが、考えるべきことです。 – Klaw

答えて

5

あなたの解決策は良いと思います。非常に高速なルックアップを提供し、ドメインと正確に一致します。

ネストされた辞書の主な問題はありますか?もしそうなら、あなたはそれについて心配しないことをお勧めします - コレクションのコレクションを使用することはしばしば非常に有用なツールです。

これだけの苦情があります:これを頻繁に使用しない場合は、不必要なデータ構造に多くの情報をロードすることになります。これが一度のルックアップの場合は、XMLに残してXPathクエリを使用する方が、事前に解析して全体をメモリにロードするよりも最適なソリューションになる可能性があります。ただし、これを頻繁に照会する場合は、これがより最適な解決策です。

+0

入れ子になっている辞書の心配はちょうど正しいです。 :) データが頻繁に取得されるため、最適化のためにすべてを一度にロードすることに決めました。(XMLを頻繁に解析するのではなく)、ノードの数がおそらく10未満になるでしょう。 ただし、ワンタイムルックアップでXMLに残しておくとよい点があります。 – Klaw

+0

ネストされた辞書は非常に便利です。私は何度も使ってきましたが、避けるべきことは何も感じていません。私はあなたの現在のアーキテクチャに固執すると言うでしょう。 –

1

すべてのノードが一意の名前を持っている限り、あなたはOKであるはずです。 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

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

0

なぜすでに存在しているものを使用することではありませんか? Like Simple XML Parser in C#

2

あなたはXML DOMを保持していて、XPathクエリで属性を見つけたらどうでしょうか?そうすれば、ノード名が重複していればそれに合わせることができます。

+0

ホイールを再発明しないための+1 –

+1

これは辞書よりもずっと遅いでしょう。 –

+0

おそらくメモリの面ではもっと高価かもしれません。 – Dolphin

0

XML文法が必要な場合は、必要に応じて作成します。パーサーが必要な場合は、.Netライブラリで提供されている多くの優れたものの1つを使用してください。ドキュメントをメモリに格納してアクセスする必要がある場合は、DOMとXPathを使用してノードを選択します。あなたがこれを必要としない場合は、XMLを使用せず、代わりにJSONのような単純なものを使用することをお勧めします。

全体をメモリに保存するだけで、値だけを保持する必要がある場合は、DataSetsを使用し、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. 
関連する問題