Подтвердить что ты не робот

Как преобразовать XML в словарь

У меня есть 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();
}
4b9b3361

Ответ 1

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

Ответ 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 (например, из файла SharedPreference приложения для Android), вы можете обрабатывать его, как показано ниже: Вот пример такого 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);