|
■No84796 (なめこ さん) に返信 > For i As Integer = 0 To dic.Count - 1 > If dic.ContainsKey("ReportCnt") Then > GMX_IniImgFileName = dic("ReportCnt") > End If > Next
ここでループさせる必要はありません。 そもそも、ループ変数 i が使われていないので、 全く同じことを繰り返すだけになってしまいます。
XML 内に /Environment/Common/ReportCnt が複数出力するのであれば、 そもそも ToDictionary が失敗します。(キー重複)
もしも /Environment/Common/ReportCnt が 0 個もしくは 1 個だけの場合は、 GMX_IniImgFileName = doc.<Environment>.<Common>.<ReportCnt>.Value() だけで十分です。
この表記の場合、ReportCnt が 0 個なら Nothing が入りますし、 ReportCnt が 2 個以上なら、最初に検出された要素が使われます。
複数の要素がある場合に位置が分かっているなら、 GMX_IniImgFileName = doc.<Environment>.<Common>(0).<ReportCnt>(0).Value() などのようにインデックスを付与することもできます。
仮に、ToDictionary した変数から拾うにしても、ループ無しで If dic.ContainsKey(要素名) Then GMX_IniImgFileName = dic(要素名) End If だけで良いはずです。
もしも Dictionary 内の要素を列挙するということなら For ではなく For Each を使って For Each entry In dic Console.WriteLine("要素名=" & entry.Key.LocalName) Console.WriteLine("値=" & entry.Value) Next です。
> <ReportName>のみ取得できません。全角等が含まれているからでしょうか。 > Key .Name = reportNo.<RepReportName>.Value,
<ReportName> が <RepReportName> になっていますよ。
…って、先の私のコードも .Name = reportNo.<ReportNo>.Value, になっていますね。申し訳ない。
ただしくは、 .Name = reportNo.<RepReportName>.Value, もしくは Key .Name = reportNo.<RepReportName>.Value, ですね。
> Public RptNo(99) As String > Public RepReportName(99) As String 管理データが 2 種だけならこれでも良いですが、項目数が多い場合は、 複数の配列を用意するのではなく、
Public Class Report Public Property No As String Public Property Name As String Public Property Orientation As Integer End Class
こんな感じのクラスを用意しておくと対処しやすいかもしれません。
データの管理は、 Public ReportSet As SortedDictionary(Of Integer, Report) に対して ReportSet = New SortedDictionary(Of Integer, Report)( doc.<Environment>.<ReportSET>.<ReportNo>.ToDictionary( Function(n) CInt(n.@kID), Function(n) New Report() With { .No = n.<ReptNo>.Value, .Name = n.<ReportName>.Value, .Orientation = CInt(n.<Orientation>.Value) } ) ) という感じで。
配列だと最初に最大要素数を確定せねばなりませんが、これなら データ件数の制限もなくなります。 (読み込んだデータ件数は ReportSet.Count で得られます)
値を取り出すときは、 x = ReportSet(1).Name y = ReportSet(1).No です。
配列に戻したければ、 RptNo = ReportSet.Select(Function(r) r.Value.No).ToArray() RepReportName = ReportSet.Select(Function(r) r.Value.Name).ToArray() ともできます。
まぁ、いろいろな方法があるということで…。
|