c # XML-сериализация - PullRequest
       4

c # XML-сериализация

3 голосов
/ 22 марта 2011

Я хотел бы сериализовать что-то вроде этого, где есть заголовок и тело.

Первая часть "galleryData" является заголовком Вторая часть "imageData" - повторяется для каждого изображения в галерее

<galleryData>
    <title>some title</title>
    <uuid>32432322</uuid>
    <imagepath>some path</imagepath>
</galleryData>

<imageData>
    <title>title one</title>
    <category>nature</category>
    <description>blah blah</description>
</imageData>

<imageData>
     <title>title two</title>
     <category>nature</category>
     <description>blah blah</description> 
</imageData>

<imageData>
    <title>title three</title>
    <category>nature</category>
    <description>blah blah</description>
</imageData>

Я вижу, как это сделать, если мне не нужна область заголовка. В настоящее время я просто использую xmlwriter для его создания, но вместо этого я хотел бы сериализовать объект в xml.

Ответы [ 6 ]

6 голосов
/ 22 марта 2011

Вам нужен рут, чтобы иметь действительный XML. Вот пример того, как может выглядеть ваша модель:

public class ImageData
{
    [XmlElement("title")]
    public string Title { get; set; }
    [XmlElement("category")]
    public string Category { get; set; }
    [XmlElement("description")]
    public string Description { get; set; }
}

public class GalleryData
{
    [XmlElement("title")]
    public string Title { get; set; }
    [XmlElement("uuid")]
    public string UUID { get; set; }
    [XmlElement("imagepath")]
    public string ImagePath { get; set; }
}

public class MyData
{
    [XmlElement("galleryData")]
    public GalleryData GalleryData { get; set; }

    [XmlElement("imageData")]
    public ImageData[] ImageDatas { get; set; }
}

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

class Program
{
    static void Main()
    {
        var myData = new MyData
        {
            GalleryData = new GalleryData
            {
                Title = "some title",
                UUID = "32432322",
                ImagePath = "some path"
            },
            ImageDatas = new[]
            {
                new ImageData
                {
                    Title = "title one",
                    Category = "nature",
                    Description = "blah blah"
                },
                new ImageData
                {
                    Title = "title two",
                    Category = "nature",
                    Description = "blah blah"
                },
            }
        };

        var serializer = new XmlSerializer(myData.GetType());
        serializer.Serialize(Console.Out, myData);
    }
}
1 голос
/ 22 марта 2011

Учитывая то, как работает сериализация XML, я не верю, что искомая структура будет возможна из прямой структуры Object -> XML, так как в вашем примере у вас более одного корневого узла.

Если у вас было что-то там, где был узел контейнера, то отдельные элементы ImageData внутри них или один элемент с избыточным изгибом для их объединения вы могли бы обойтись этим.

0 голосов
/ 22 марта 2011

Показанная вами структура не является допустимым XML, поскольку содержит более одного корневого узла, поэтому вы можете забыть о XmlSerializer.Если вы хотите легко справиться с подобными XML-структурами, я предлагаю Html Agility Pack

0 голосов
/ 22 марта 2011

Вы можете использовать что-то вроде следующего для сериализации объекта .NET в XML-строку:

    protected string ObjectToXml<T>(T obj)
    {
        var sw = new StringWriter();

        try
        {
            var mySerializer = new XmlSerializer(typeof(T));
            mySerializer.Serialize(sw, obj);
        }
        catch (Exception ex)
        {
           // Error logging here
        }

        return sw.ToString();
    }

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

0 голосов
/ 22 марта 2011

Вы можете создать объект для заголовка со свойствами, пометить его с помощью XmlSerializabe и добавить поле типа List, чтобы стандартный сериализованный xml сериализировал его как дочерние элементы заголовка

0 голосов
/ 22 марта 2011

Если вы используете XmlSerialization, вам понадобится корневой элемент - это будет класс, который вы сериализуете.

Ваши galleryData и imageData будут переменными экземпляра объекта в классе, используемом для вашего корневого элемента.

...