0

我想List<string>根据我的 XDocument 中的“MASTERKEY”元素创建多个不同的 s 或 var 或任何其他集合,并希望根据 RMSId 过滤结果。

下面 XML 中的示例 如果我过滤 RMSId = "xyz",那么我应该有 3 个“MASTERKEY”元素集合(美国、英国、欧元),并且集合应该包含“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”元素的位置。然后,您可以通过键访问值列表。

这可能不是最优雅的方法,但它会起作用(在 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,这将提供一个包含三个键(USA、UK 和 EUR)的字典,每个键都有一个对应于该键的“BM”值列表。

一些注意事项 - 我使用(string)而不是.Value处理元素丢失或属性丢失的情况 - 它将返回 null。

在键的情况下,我更进一步,使用空合并运算符 ( ??) 设置默认值“Uknown”,以防找不到“MASTERKEY”元素,以防止尝试将空键插入字典.

于 2013-09-16T01:25:39.683 回答