2010-09-06 2 views
1
string xml="< theme> 

<colors> 

<color> 
<code>1</code> 
<name>blue</name> 
<priority>5</priority> 
</color> 

<color> 
<code>2</code> 
<name>red</name> 
<priority>2</priority> 
</color> 

<color> 
<code>3</code> 
<name>green</name> 
<priority>7</priority> 
</color> 

</colors> 
</theme>" 

Я хотел бы преобразовать эту строку xml в Список словарей, называемых, скажем, «цветами». Например:Как преобразовать строку xml в список словарей?

List< Dictionary< string, string>> colors=new List< Dictionary< string, string>>(); 
colors=//Magic happens here 

colors[0]["name"] would return 'blue' 
colors[2]["priority"] would return '7' 

т.д.

Спасибо.

ответ

3

Предполагая, что вы используете LINQ к XML, который относительно легко:

var query = doc.Descendants("colors") 
       .Elements() // Get to each "color" element 
       .Select(outer => outer.Elements() 
            .ToDictionary(x => x.Name.LocalName, 
                x => x.Value)) 
       .ToList(); 

Позвольте мне знать, если какой-либо из этого не имеет смысла для вас.

EDIT: Упс, это было бы List<Dictionary<XName, string>>. Исправлено:

EDIT: Я отмечаю в ваших комментариях, что вы используете полностью квалифицированные имена. Попробуйте использовать эти директивы:

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

Они должны найти методы расширения.

+0

Спасибо, Джон. Я полагаю, что doc: System.Xml.Linq.XElement.Parse (xml) (xml хранится в строке с именем «xml») Правильно? – Anthony

+0

Я получаю это сообщение об ошибке: «Элемент с тем же ключом уже добавлен». Правильно ли следующее? System.Xml.Linq.XElement doc = System.Xml.Linq.XElement.Parse (xml); – Anthony

+0

@ Энтони: Дох, извините - небольшая опечатка. Фиксация ... –

1

с помощью LINQ:

 var d = XDocument.Parse(x); 
     var l = new List<Dictionary<string, string>>(
      from color in d.Root.Element("colors").Elements("color") 
      select color.Elements().ToDictionary(k => k.Name.LocalName, k=>k.Value) 

      ); 

(где X представляет собой строку)

+0

Любая причина, по которой вы явно создаете список, вместо использования ToList? –

+0

@ Jon Skeet: На самом деле, я не уверен сейчас. Возможно, я использовал его, чтобы продемонстрировать, что вы получите совершенно новый «Список <Словарь <строка, строка >>». – nothrow

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