解析XML文件节点并将其存储到Dictionary

时间:2019-08-12 09:33:14

标签: c# xml linq dictionary

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

3 个答案:

答案 0 :(得分:3)

.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);

答案 1 :(得分:2)

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();

答案 2 :(得分:1)

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

k.Name将始终为item,而不是key="..."的值。

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