4

LINQ を使用して、XML のサブ子値をディクショナリ コレクションに入れようとしています。XML と同じ構造に従うリストとカスタム コレクションでこれを行いましたが、特定の値を検索することはできません。parentName、childName、および subChildName がわかっている場合は、コレクション全体と後続の各サブコレクションを繰り返し処理することなく、subChildProperty1.value と subChildProperty2.value を見つけられるようにしたいと考えています。これは最良の実装ではない可能性があり、提案を受け付けていますが、それでもこれを機能させる方法を理解したいと考えています。これにより、辞書項目を次のようにすることができます。

key = "parentNameValue1.childNameValue1.subchildNameValue1.subChildProperty1"
value = 0

文字列を連結して特定のキーを形成し、そのキーを検索して値を返すことができます。

XML:

<root>
    <parent>
        <parentName>parentNameValue1</parentName>
        <child>
            <childName>childNameValue1</childName>
            <subchild>
                <subchildName>subchildNameValue1</subchildName>
                <subChildProperty1>0</subChildProperty1>
                <subChildProperty2>5</subChildProperty2>
            </subchild>
            <subchild>
                <subchildName>subchildNameValue2</subchildName>
                <subChildProperty1>0</subChildProperty1>
                <subChildProperty2>10</subChildProperty2>
            </subchild>
        </child>
    </parent>
<root>

この質問は、こちらの質問と多少似ていますが、VB でアプリケーションのコードを動作させることができませんでした。

SO (および VB) は初めてなので、エチケットが間違っていたら申し訳ありません。

4

1 に答える 1

5

VB.NETの優れたXMLサポートにより、これは非常に簡単に実行できます。

Imports System.Xml.Linq

...

Sub Main()
    Dim xml = _
        <root>
            <parent>
                <parentName>parentNameValue1</parentName>
                <child>
                    <childName>childNameValue1</childName>
                    <subchild>
                        <subchildName>subchildNameValue1</subchildName>
                        <subChildProperty1>0</subChildProperty1>
                        <subChildProperty2>5</subChildProperty2>
                    </subchild>
                    <subchild>
                        <subchildName>subchildNameValue2</subchildName>
                        <subChildProperty1>0</subChildProperty1>
                        <subChildProperty2>10</subChildProperty2>
                    </subchild>
                </child>
            </parent>
        </root>

    ' Alternatively, load XML from a file
    ' Dim xml = XDocument.Load(fileName)

    Dim dict As New Dictionary(Of String, Integer)

    ' Extract the properties
    For Each parent In xml.<parent>
        Dim parentName = parent.<parentName>.Value
        For Each child In parent.<child>
            Dim childName = child.<childName>.Value
            For Each subchild In child.<subchild>
                Dim subchildName = subchild.<subchildName>.Value
                For Each prop In subchild.Elements.Where(Function(e) e.Name <> "subchildName")
                    dict.Add(String.Format("{0}.{1}.{2}.{3}", parentName, childName, subchildName, prop.Name), _
                             Integer.Parse(prop.Value))
                Next
            Next
        Next
    Next

    ' Print the values, to show that we've done a good job
    For Each kv In dict
        Console.WriteLine("{0}: {1}", kv.Key, kv.Value)
    Next
    Console.ReadLine()
End Sub

(明らかに、コードはOptionStrictOnとOptionInferOnを想定しています。)

于 2012-05-29T19:03:17.507 に答える