解析 XML 文件节点并将其存储到字典中


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

我想解析语言名称 == "EN" 的上述 xml 文件并将键值对存储在字典中。我在下面尝试的代码..但是错误显示已添加具有相同键的项目。请帮忙。

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);
.ToDictionary(k => k.Name, v => v.Value);

k是一个item,如果你想让你的Dictionary喜欢

[0] = {[play, play]}
[1] = {[pause, pause]}

我认为对于每个item,您访问属性以获取值

var output = doc.Element("LanguagePacks")
.Descendants().Where(r=>(string)r.Attribute("name").Value == "EN")
.Descendants() // list of item
.ToDictionary(k => k.Attribute("key").Value, v => k.Attribute("value").Value);

ToDictionary(k => k.Name, v => v.Value)不会按您想要的方式工作,因为NameValue属性是节点名称(item(和节点内容(无(,而不是xml属性"key""value"

当您实际上只想在一个级别上循环访问元素时,也不应该使用Descendants。 在示例 XML 上运行代码会给出 NullReferenceException,因为<LanguagePacks>的某些后代没有name属性,并且您假定它们都具有。

此代码应执行所需的操作。请注意,如果您有重复的键,或者如果<item />元素缺少键或值属性,这也将崩溃。

doc.Element("LanguagePacks")
.Elements("Language")
.Where(x => x.Attribute("name")?.Value == "EN")
.Elements("item")
.ToDictionary(x => x.Attribute("key").Value, x => x.Attribute("value").Value)
.Dump();

in

.ToDictionary(k => k.Name, v => v.Value);

k.Name永远是item,而不是key="..."的值。

我想v.Value永远是"",不完全确定。

最新更新