Linq to XML, детализация - PullRequest
       34

Linq to XML, детализация

0 голосов
/ 26 августа 2009

У меня есть XML, который выглядит примерно так

<?xml version="1.0" encoding="utf-8" ?>
<Applicant>
  <NameValueGroup attribute="Name">
    <NameValue desc="One" value="test1"/>
    <NameValue desc="Two" value="test2"/>
    <NameValue desc="Three" value="test3"/>
    <NameValue desc="Four" value="test4"/>
  </NameValueGroup>
  <NameValueGroup attribute="News">
    <NameValue desc="news1" value="Something1"/>
    <NameValue desc="news2" value="Something2"/>
    <NameValue desc="news3" value="Something3"/>
    <NameValue desc="news4" value="Something4"/>
  </NameValueGroup>
</Applicant>

Как я напишу запрос LINQ to XML для десериализации этого XML.

Ответы [ 2 ]

0 голосов
/ 26 августа 2009

Я создал класс под названием Applicant со свойством типа Dictionary с ключом string и значением другого Dictonary<string, string>

public class Applicant {
    public Dictionary<string, Dictionary<string, string>> NameValueGroup { get; set; }
}

Чтобы заполнить это свойство, я делаю это.

XDocument document = XDocument.Load("data.xml");
Applicant applicant = new Applicant();

applicant.NameValueGroup = document.Element("Applicant").
                            Descendants("NameValueGroup").
                            ToDictionary(keyElement => keyElement.Attribute("attribute").Value, valueElement => valueElement.Descendants().
                                 ToDictionary(e => e.Attribute("desc").Value, e => e.Attribute("value").Value));

Пожалуйста, извините за плохое форматирование. Трудно сделать этот запрос приятным для просмотра!

0 голосов
/ 26 августа 2009

Это работает, но не имеет обработки ошибок для пустых / пропущенных значений. Наслаждайтесь.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LinqToXmlExample
{
    class Program
    {
        static void Main(string[] args)
        {
            var x = XDocument.Load("input.xml");

            var content =
                from node in x.Descendants("Applicant").Descendants("NameValueGroup")
                select new NameValueGroup()
                           {
                                Attribute = node.Attribute("attribute").Value,
                                NameValues = GetNameValues(node.Descendants())
                           };

            foreach (NameValueGroup item in content)
            {
                Console.WriteLine(item.Attribute);
                foreach (var name in item.NameValues)
                {
                    Console.WriteLine("{0} - {1}", name.Desc, name.Value);
                }
            }

            Console.ReadLine();
        }

        static List<NameValue> GetNameValues(IEnumerable<XElement> elements)
        {
            var x = new List<NameValue>();
            if(elements != null && elements.Any())
            {
                x =
                    (from node in elements
                    select new NameValue()
                               {
                                   Desc = node.Attribute("desc").Value,
                                   Value = node.Attribute("value").Value
                               }).ToList();
            }
            return x;
        }

        class NameValueGroup
        {
            public string Attribute { get; set; }
            public List<NameValue> NameValues { get; set; }
        }

        class NameValue
        {
            public string Desc { get; set; }
            public string Value { get; set; }
        }
    }
}
...