Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to xml 以下XDocument应该使用什么linq?_Linq To Xml - Fatal编程技术网

Linq to xml 以下XDocument应该使用什么linq?

Linq to xml 以下XDocument应该使用什么linq?,linq-to-xml,Linq To Xml,我想根据XDocument中的“MASTERKEY”元素创建多个不同的列表s或var或任何其他集合,并想根据RMSId筛选结果 下面XML中的示例:如果我在RMSId=“xyz”上进行筛选,那么我应该有3个“MASTERKEY”元素集合(美国、英国、欧洲),集合应该包含“BM”元素作为值 对于RMSId=“xyz”--美国集合将包含{FX-SP,IR-D} 对于RMSId=“xyz”--UK集合将包含{FX-S,FX-SUK} 我正在尝试使用LINQtoXML,但仍在学习并发现很难运行它。请告知

我想根据XDocument中的“MASTERKEY”元素创建多个不同的
列表
s或var或任何其他集合,并想根据RMSId筛选结果

下面XML中的示例:如果我在RMSId=“xyz”上进行筛选,那么我应该有3个“MASTERKEY”元素集合(美国、英国、欧洲),集合应该包含“BM”元素作为值

对于RMSId=“xyz”--美国集合将包含{FX-SP,IR-D}

对于RMSId=“xyz”--UK集合将包含{FX-S,FX-SUK}

我正在尝试使用LINQtoXML,但仍在学习并发现很难运行它。请告知

请让我知道,如果你需要任何进一步的细节或寻求任何澄清

<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>

FX-SP
123
456
美国
纽约
红外-D
789
456
美国
别致的
FX-SUK
3453
4353453
英国
隆德
FX-V
44
O23F
欧元
城市
FX-S
4676
45646
英国
英格
FX-SPS
4676
45646
美国
纽约
个人计算机
4646
7979
英国
隆德

我建议使用
字典
,其中“MASTERKEY”的值是键,该值是一个
列表
,其中包含该键的所有“BM”元素。然后,您可以通过键访问值列表

这可能不是最优雅的方式,但它可以工作(在VS 2012 64位Win7上测试):

XDocument xDoc=XDocument.Load(xmlFile);
//如果有字符串而不是文件,请使用XDocument.Parse(xmlString)
字典(字符串)bm.Element(“bm”).ToList()
}).ToDictionary(k=>k.MASTERKEY,v=>v.BM);
基于您的示例XML,这将提供一个包含三个键(USA、UK和EUR)的字典,每个键对应一个“BM”值列表

几个注意事项-我使用
(string)
而不是
.Value
来处理缺少元素或缺少属性的情况-它将返回null


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

谢谢,但“}”似乎有一些问题。ToDictionary(k=>k.MASTERKEY,v=>v.BM);”因为有一个结束圆括号“)”,但缺少开始括号。很抱歉-现在已修复。
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);