Linq to xml 以下XDocument应该使用什么linq?
我想根据XDocument中的“MASTERKEY”元素创建多个不同的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,但仍在学习并发现很难运行它。请告知
列表
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);