如何将XML转换为字典

18

我有以下的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <data name="LogIn">Log In</data>
  <data name="Password">Password</data>
</root>

我成功地完成了这个任务,而不使用Linq,有人可以帮助我将以下代码转换为Linq吗:

using (XmlReader reader = XmlReader.Create(_xml))
{
    while (reader.Read())
    {
       if (reader.NodeType == XmlNodeType.Element && reader.LocalName == "data")
       {
          reader.MoveToAttribute("name");
          string key = reader.Value;
          reader.MoveToContent();
          string value = reader.ReadElementContentAsString();
          _dictionary.Add(key, value);
       }
    }
    reader.Close();
}

6
在一个XML文件中使用明文密码... - Daniel Brückner
3个回答

21
var xdoc = XDocument.Load(path_to_xml);
_dictionary = xdoc.Descendants("data")
                  .ToDictionary(d => (string)d.Attribute("name"),
                                d => (string)d);

我得到了以下错误: “System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>”不包含“ToDictionary”的定义,也没有接受类型为“System.Collections.Generic.IEnumerable<System.Xml.Linq.XElement>”的第一个参数的扩展方法“ToDictionary”可以找到(您是否缺少使用指令或程序集引用?) - Ramzy Abourafeh
6
请添加 using System.Linq;,这样您就可以使用 LINQ 扩展方法。 - ken2k
@lazyberezovsky,Descendants(“data”)是什么意思? - Habib
@Habib,它返回此文档中名称为“data”的后代元素msdn - 与xpath //data相同。 - Sergey Berezovskiy
1
太棒了!@Habib,也许xdoc.Element("Root").Elements()更适合你?但在这里做的是相同的事情。 - efkah
1
@lazyberezovsky,+1并感谢您提供的链接,也感谢efkah。 - Habib

0

这是一个老问题,但如果有人遇到了一个 'Typed' 的 xml(例如来自 Android 应用的 SharedPreference 文件),您可以按照以下方式处理它:这是我从一个 Instagram 应用程序中获取的这样一个 xml 的示例。

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="pinnable_stickers" value="false" />
<string name="phone_number">+254711339900</string>
<int name="score" value="0" />
<string name="subscription_list">[]</string>
<long name="last_address_book_updated_timestamp" value="1499326818875" />
 //...other properties
</map>

请注意值属性中的不一致性。某些字段(例如类型为string的字段)没有明确定义它。
var elements = XElement.Load(filePath)
.Elements()
.ToList();
var dict = new Dictionary<string, string>();    
var _dict = elements.ToDictionary(key => key.Attribute("name").Value,
                        val => val.Attribute("value") != null ?
                        val.Attribute("value").Value : val.Value);

0
XDocument xdoc = XDocument.Load("test.XML");
var query = xdoc.Descendants("root")
                .Elements()
                .ToDictionary(r => r.Attribute("name").Value,
                             r => r.Value);

记得包含:

using System.Linq;
using System.Xml.Linq;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接