【发布时间】:2019-08-12 09:33:14
【问题描述】:
<?xml version="1.0" encoding="utf-8" ?>
<LanguagePacks>
<Language name = "EN">
<item key="play" value="play"/>
<item key="pause" value="pause"/>
<item key="resume" value="resume"/>
<item key="all" value="all"/>
<item key="songs" value="songs"/>
<item key="song" value="song"/>
<item key="skip" value="skip"/>
<item key="next" value="next"/>
<item key="previous" value="previous"/>
<item key="number" value="number"/>
<item key="album" value="album"/>
</Language>
<Language name = "DE">
<item key="play" value="spiel"/>
<item key="pause" value="pause"/>
<item key="resume" value="resume"/>
<item key="all" value="alle"/>
<item key="songs" value="lieder"/>
<item key="song" value="lied"/>
<item key="skip" value="skipp"/>
<item key="next" value="nachste"/>
<item key="previous" value="vorheriger"/>
<item key="number" value="nummer"/>
<item key="album" value="alben"/>
</Language>
</LanguagePacks>
我想解析上述 xml 文件中的 Language name == "EN" 并将键值对存储在字典中。我在下面尝试的代码..但错误显示已添加具有相同键的项目。请帮忙。
XDocument doc = XDocument.Load($"{path}");
var output = doc.Element("LanguagePacks")
.Descendants().Where(r=>(string)r.Attribute("name").Value == "EN")
.Descendants()
.ToDictionary(k => k.Name, v => v.Value);
【问题讨论】:
-
您肯定不想要
LanguagePacks的后代的后代。我认为您可以删除第二个Descendants-call。否则你肯定有两个items命名为play,例如。 -
尝试以下操作: Dictionary
output = doc.Descendants("Language").Where(x => (string)x.Attribute("name") == "EN") .FirstOrDefault().Elements("item") .GroupBy(x => (string)x.Attribute("key"), y => (string)y.Attribute("value")) .ToDictionary(x => x.Key, y => y.FirstOrDefault());
标签: c# xml linq dictionary