如何将 XML 转换为字典

Posted

技术标签:

【中文标题】如何将 XML 转换为字典【英文标题】:How to convert XML to Dictionary 【发布时间】:2012-12-06 19:22:55 【问题描述】:

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

【问题讨论】:

XML 文件中的纯文本密码... 【参考方案1】:
var xdoc = XDocument.Load(path_to_xml);
_dictionary = xdoc.Descendants("data")
                  .ToDictionary(d => (string)d.Attribute("name"),
                                d => (string)d);

【讨论】:

我收到以下错误:“System.Collections.Generic.IEnumerable”不包含“ToDictionary”的定义,并且没有扩展方法“ToDictionary”接受可以找到“System.Collections.Generic.IEnumerable”类型的第一个参数(您是否缺少 using 指令或程序集引用?) @RamzyAbourafeh 添加 using System.Linq; 以便您可以使用 LINQ 扩展方法。 @lazyberezovsky,Descendants("data") 是做什么的? 太棒了! @Habib,也许 xdoc.Element("Root").Elements() 更适合您?但在这里也一样。 @lazyberezovsky,+1 并感谢您的链接,感谢 efkah【参考方案2】:
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;

【讨论】:

【参考方案3】:

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

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

注意 value 属性的不一致。某些字段(例如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);

【讨论】:

以上是关于如何将 XML 转换为字典的主要内容,如果未能解决你的问题,请参考以下文章

Python面试必考重点之数据存储第二关——XML文档和字典的互转

Python每日一练——数据存储第二关:XML文档和字典的互转

使用 Penelope 将 xml/stardict 字典转换为 Bookeen 格式

Python爬虫编程思想(77): XML字符串转换为字典

Python爬虫编程思想(77): XML字符串转换为字典

将父元素添加到子元素以具有一个元组(将 XML 转换为字典集合时)