Экспорт коллекции объектов (которая, в свою очередь, содержит объект коллекции) в XML - PullRequest
1 голос
/ 27 марта 2011

У меня есть класс объекта данных, который хранит несколько свойств. Один из них - папка, а другой - string[] всех файлов в этом массиве.

Что мне нужно сделать, это записать это в XML, как показано ниже:

<X>
   <a>dir</a>
      <b>file</f>

Таким образом, все файлы (для каждого объекта данных имеется массив string[]) вложены в поле каталога.

Это легко возможно? Или есть внешняя библиотека, которая может сделать это легко для меня?

Спасибо

Ответы [ 2 ]

2 голосов
/ 27 марта 2011

вы имеете в виду что-то вроде этого:

var myxml = new XElement(yourObj.FolderName);
myxml.Add(new XElement("Files",yourObj.Files.Select(x => new XElement("File",x)));
1 голос
/ 27 марта 2011

Используйте Xml Serializer, чтобы сделать работу за вас?

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

namespace NS
{
    public class Data
    {
        public class Nested
        {
            public string The     { get; set; }
            public string[] stuff = {"lazy Cow Jumped Over", "The", "Moon"};
        }

        public List<Nested> Items;
    }

    static class Helper
    {
        public static string ToXml<T>(this T obj) where T:class, new()
        {
            if (null==obj) return null;

            using (var mem = new MemoryStream())
            {
                var ser = new XmlSerializer(typeof(T));
                ser.Serialize(mem, obj);
                return System.Text.Encoding.UTF8.GetString(mem.ToArray());
            }
        }

        public static T FromXml<T>(this string xml) where T: new()
        {
            using (var mem = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(xml)))
            {
                var ser = new XmlSerializer(typeof(T));
                return (T) ser.Deserialize(mem);
            }
        }

    }

    class Program
    {
        public static void Main(string[] args)
        {
            var data = new Data { Items = new List<Data.Nested> { new Data.Nested {The="1"} } };
            Console.WriteLine(data.ToXml());

            var clone = data.ToXml().FromXml<Data>();
            Console.WriteLine("Deserialized: {0}", !ReferenceEquals(data, clone));
            Console.WriteLine("Identical: {0}", Equals(data.ToXml(), clone.ToXml()));
        }
    }
}

Будет выводить

<?xml version="1.0" encoding="utf-8"?>
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Items>
    <Nested>
      <stuff>
        <string>lazy Cow Jumped Over</string>
        <string>The</string>
        <string>Moon</string>
      </stuff>
      <The>1</The>
    </Nested>
  </Items>
</Data>
Deserialized: True
Identical: True

Существуют некоторые угловые случаи и ошибки, особенно при работе с существующим XSD, но все это очень хорошо описано и документировано в другом месте.

...