2014-10-26 2 views
2

У меня есть следующий XML:Хранение XML в гнездовой словаре

<root> 
    <Animals> 
     <Pet name ="Ruby"> 
      <Owner name = "John Smith"/> 
      <Type name = "Dog"/> 
      <Breed name = "Labrador"/> 
      <Sex name = "Female"/> 
      <Desexed name = "Yes"/> 
      <Age name = "7 years"/> 
     </Pet> 
     <Pet name ="Charlie"> 
      <Owner name = "John Q"/> 
      <Type name = "Dog"/> 
      <Breed name = "Pug"/> 
      <Sex name = "Female"/> 
      <Desexed name = "No"/> 
      <Age name = "2 Years"/> 
     </Pet> 
    </Animals> 
</root> 

, и я хочу, чтобы сохранить имя элемента и значение его атрибута «имя» для каждого «Pet» и его потомков в вложенный словарь. Я не знаю, будет ли словарь лучшим способом хранить эту информацию или нет, но если бы я должен был хранить его в словаре, я бы сохранил его в Dictionary<string, Dictionary<string, string>>, где ключ - это имя домашнего животного (например, Ruby, Charlie) а ключом вложенного словаря является каждое имя атрибута (Owner, Type, Breed, Sex, Desexed, Age), а значением является значение атрибута name. Кто-нибудь может мне с этим помочь? Я нахожу LINQ очень запутанным. На данный момент у меня это хранится в XDocument.

+0

У вас возникли вопросы? Не совсем понятно, что вы здесь задаете. Угадывание с моей стороны: информация для каждого «ПЭТ» выглядит как один объект-контейнер данных для меня. Почему бы просто не объявить один класс с Owner, Type, Breed и т. Д. В качестве свойств, в которых вы храните эти фрагменты информации? Вы можете использовать экземпляры этого класса в качестве значений в словаре, где имя животного является ключом. –

+0

'Я хочу сохранить его' как? для чего? это невероятно смутно – Jonesopolis

+1

Является ли имя Pet уникальным? если не Dic не лучший вариант –

ответ

1

Это вы имеете в виду?

var dictionary = 
    xd 
     .Descendants("Pet") 
     .ToDictionary(
      x => x.Attribute("name").Value, 
      x => x.Elements() 
       .ToDictionary(
        y => y.Name, 
        y => y.Attribute("name").Value)); 

Я получаю этот результат:

nested dictionry

+0

Большое спасибо. Я изменил одну второстепенную вещь, которая была 'y => y.Name' to 'y => y.Name.ToString()', так что вложенный словарь и not . Спасибо. – user3634559

+0

@ user3634559 - Да, я тоже должен был это сделать. – Enigmativity

1

Я бы построить класс «Pet» в качестве модуля для данных и читать каждый элемент в классе Pet. Тогда я просто оставил бы Домашние животные в массиве. Словарь не является хорошим вариантом, поскольку имена домашних животных могут быть не уникальными.

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