0

XDocument の "MASTERKEY" 要素に応じて、複数の異なるList<string>s または var またはその他のコレクションを作成し、RMSId に基づいて結果をフィルター処理したいと考えています。

以下の XML の例 RMSId = "xyz" でフィルター処理する場合、"MASTERKEY" 要素 (USA、UK、EUR) の 3 つのコレクションが必要であり、コレクションには値として "BM" 要素が含まれている必要があります。

RMSId = "xyz" の場合 -- USA コレクションには {FX-SP, IR-D} が含まれます

RMSId = "xyz" の場合 -- UK コレクションには {FX-S, FX-SUK} が含まれます

LINQ to XML を使用しようとしていますが、まだ学習中であり、これを実行するのは難しいと感じています。お知らせ下さい。

さらに詳細が必要な場合、または明確にする必要がある場合はお知らせください。

<MSKEYS>
  <RM>
    <RMS Id="xyz">
      <Details>
        <MDetails>
          <BM>FX-SP</BM>
          <CM>123</CM>
          <RC>456</RC>
          <MASTERKEY>USA</MASTERKEY>
          <Filter>NYK</Filter>
        </MDetails>
        <MDetails>
          <BM>IR-D</BM>
          <CM>789</CM>
          <RC>456</RC>
          <MASTERKEY>USA</MASTERKEY>
          <Filter>CHIC</Filter>
        </MDetails>
        <MDetails>
          <BM>FX-SUK</BM>
          <CM>3453</CM>
          <RC>4353453</RC>
          <MASTERKEY>UK</MASTERKEY>
          <Filter>LOND</Filter>
        </MDetails>
        <MDetails>
          <BM>FX-V</BM>
          <CM>44</CM>
          <RC>O23F</RC>
          <MASTERKEY>EUR</MASTERKEY>
          <Filter>ITY</Filter>
        </MDetails>
        <MDetails>
          <BM>FX-S</BM>
          <CM>4676</CM>
          <RC>45646</RC>
          <MASTERKEY>UK</MASTERKEY>
          <Filter>ENG</Filter>
        </MDetails>
      </Details>
    </RMS>
    <RMS RunId="abcd">
      <Details>
        <MDetails>
          <BM>FX-SPS</BM>
          <CM>4676</CM>
          <RC>45646</RC>
          <MASTERKEY>USA</MASTERKEY>
          <Filter>NYK</Filter>
        </MDetails>
        <MDetails>
          <BM>PC</BM>
          <CM>4646</CM>
          <RC>7979</RC>
          <MASTERKEY>UK</MASTERKEY>
          <Filter>LOND</Filter>
        </MDetails>
      </Details>
    </RMS>
  </RM>
</MSKEYS>
4

1 に答える 1

0

Dictionary<string, List<string>>「MASTERKEY」の値がキーであり、値がそのキーのList<string>すべての「BM」要素を含むa であることをお勧めします。その後、キーを介して値リストにアクセスできます。

これはおそらく最もエレガントな方法ではありませんが、動作します (Win7 64 ビットの VS 2012 でテスト済み):

XDocument xDoc = XDocument.Load(xmlFile);
// Use XDocument.Parse(xmlString) if you have a string instead of a file

Dictionary<string, List<string> myResults = new Dictionary<string, List<string>>();
myResults = (from x in xDoc.Root.Elements("RM").Elements("RMS")
            where (string)x.Attribute("id") == "xyz"
            from d in x.Element("Details").Elements("MDetails")
            group d by (string)d.Element("MASTERKEY") ?? "Unknown" into g
            select new
            {
                MASTERKEY = g.Key,
                BM = g.Select(bm => (string)bm.Element("BM")).ToList()
            }).ToDictionary(k => k.MASTERKEY, v => v.BM);

サンプル XML に基づいて、これは 3 つのキー (USA、UK、および EUR) を持つ辞書を提供し、それぞれにそのキーの「BM」値の対応するリストがあります。

いくつかの注意事項 -要素が欠落している、または属性が欠落しているケースを処理する(string)代わりに使用しました - null を返します。.Value

キーの場合は、さらに一歩進んで??、「MASTERKEY」要素が見つからない場合に備えて、NULL 合体演算子 ( ) を使用してデフォルト値の「Uknown」を設定し、NULL キーを辞書に挿入しようとするのを防ぎました。 .

于 2013-09-16T01:25:39.683 に答える