Как быстро десериализовать XML в тип? - PullRequest
0 голосов
/ 16 апреля 2010

Предположим, у меня есть этот XML в виде строки:

<calles>
  <calle>
   <nombre>CALLAO AV.</nombre>
   <altura>1500</altura>
   <longitud>-58.3918617027</longitud>
   <latitud>-34.5916734896</latitud>
   <barrio>Recoleta</barrio>
  </calle>
 </calles>

И у меня есть этот тип, который я создал для сопоставления этого XML:

public class Ubicacion
{
    public string Latitud { get; set; }
    public string Longitud { get; set; }
    public string Nombre { get; set; }
    public string Altura { get; set; }
    public string Barrio { get; set; }

    public Ubicacion() { }
}

Мне нужно взять этот XML-файл и создать объект с этими значениями ...

Кто-нибудь знает быстрый способ сделать это? с C #? Я пытался это, но не работает вообще ...

XElement dir = XElement.Parse(text);

Ubicacion informacion = from d in dir.Elements("calle").
        select new Ubicacion
        {
           Longitud = d.Element("longitud").Value,
           Latitud = d.Element("latitud").Value,
           Altura = d.Element("altura").Value,
           Nombre = d.Element("nombre").Value,
           Barrio = d.Element("barrio").Value,
        };
return informacion.Cast<Ubicacion>();

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 16 апреля 2010

Вы пробовали это?

 XElement dir = XElement.Parse(text); 

        var informacion = from d in dir.Elements("calle"). 
                          select new Ubicacion 
                          { 
                              Longitud = d.Element("longitud").Value, 
                              Latitud = d.Element("latitud").Value, 
                              Altura = d.Element("altura").Value, 
                              Nombre = d.Element("nombre").Value, 
                              Barrio = d.Element("barrio").Value, 
                          }.ToList();

Помните, что запрос LINQ не будет выполнен, пока вы не выполните его итерацию. Метод расширения .ToList() сделает это за вас. Затем он произведет коллекцию List<Ubicacion>.

3 голосов
/ 16 апреля 2010

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

  • дважды запустите ваш data.xml через xsd.exe - сначала используйте xsd.exe (filename).xml, который создаст схему XML для вашего файла XML с тем же именем и расширением .xsd
  • во-вторых, запустите xsd.exe /c (filename).xsd, который создаст класс C #, соответствующий вашему XML
  • теперь вы можете легко десериализовать XML в класс C #
  • настройка AutoMapper для простого сопоставления вашего сгенерированного / десериализованного класса с экземпляром целевого типа - поскольку оба типа имеют идентичные имена свойств, настройка AutoMapper очень проста:

    Mapper.CreateMap<Deserialized, Ubicacion>();
    Ubicacion target = Mapper.Map<Deserialized, Ubicacion>(your-deserialized-instance);
    

    и это все, что нужно сделать!

В зависимости от того, сколько раз вам нужно это сделать, это может быть более простым способом, чем ручной анализ XML на куски и фрагменты и сборка новых экземпляров объекта на основе этого анализа.

...