2012-01-21 2 views
0

Я ищу хороший способ преобразования XmlDocument в Dictionary<string, string> с использованием Linq.Преобразование XmlDocument в словарь <string, string>

Мой XML отформатирован следующим образом:

<config> 
    <field>value</field> 
    <field2>value2</field2> 
</config> 

Я хотел бы, чтобы поместить это в словарь с ключевым паром значений вида:

поля, значение
field2, значение2

Я думаю, что я должен использовать Linq для этого, но я не уверен в синтаксисе.

+0

Есть ли один узел в документе XML или строке? – adatapost

ответ

4

Я не знаю, если его лучший путь, но его чистый & простой ..

XElement xdoc = XElement.Load("yourFilePath"); 
Dictionary<string, string> result = (from element in xdoc.Elements() select new KeyValuePair<string, string>(element.Name.ToString(), element.Value)).ToDictionary(x => x.Key, x => x.Value); 
+3

Чистота ... может быть ... легко читать ... определенно нет. – MyKuLLSKI

+0

Ну, linq его, как и должно быть известно, в настоящее время ... идея заключалась в том, чтобы доставить очень короткое решение, но вы можете пойти с заявлением foreach ... –

2

Один из способов сделать это с помощью LINQ будет следующим Создание документа XML с помощью

XElement xDoc = XElement.Parse("<config><field>value</field><field2>value2</field2</config>"); 

Для простоты я встраиваемыми ваш XML фрагмент кода в разборе непосредственно.

Затем вы можете создать запрос с помощью следующей

var query = from xEle in xDoc.Descendants() 
select new { tag = xEle.Name.LocalName, value = xEle.Value }; 

Затем преобразовать этот запрос в словарь, используя простой для каждого цикла.

Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
foreach (var CurNode in query) 
{ 
    dictionary.Add(CurNode.tag, CurNode.value); 
} 
+0

+1 для усилий. Более прямой подход - использовать метод «ToDictionary». См. Мой ответ для примера. –

5

Использование XmlDocument, на ваш вопрос, вы можете использовать этот подход, чтобы получить Dictionary<string, string>.

string input = @"<config> 
    <field>value</field> 
    <field2>value2</field2> 
</config>"; 

var xml = new XmlDocument(); 
xml.LoadXml(input); 

var dict = xml.SelectNodes("/config/*") 
       .Cast<XmlNode>() 
       .ToDictionary(n => n.Name, n => n.InnerText); 

Если вы можете использовать XElement, вы можете использовать либо метод Parse для загрузки XML из строки, или использовать метод Load, чтобы загрузить его из файла. Тогда этого подхода должно быть достаточно:

var xml = XElement.Parse(input); 
var dict = xml.Elements() 
       .ToDictionary(n => n.Name.LocalName, n => n.Value); 
+0

+1, потому что мне нравится ваш метод немного больше, чем мой. Ваш метод гораздо более непосредственен, чем мой, и теперь я знаю о вызове ToDictionary. –

Смежные вопросы