none
Cоздание xml из xsd RRS feed

  • Вопрос

  • Здравствуйте, появилась проблема на работе...После обработки xsd-шаблона xsd.exe, в файле появилось немало классов...вопрос в том, что мне нужно при выводе всего этого добра в xml, сохранить их иерархию(т.е. что бы все было внутри тего <root> и т.д.)
    Есть ли возможность это сделать?

    Заранее благодарен за ответ!
    13 февраля 2013 г. 10:36

Ответы

  • Допустим, имеется такой набор классов:

    public partial class Root
    {
        private RootPackageData packageDataField;
        private RootAuthData authDataField;
    
        public RootPackageData PackageData
        {
            get { return this.packageDataField; }
            set { this.packageDataField = value; }
        }
    
        public RootAuthData AuthData
        {
            get { return this.authDataField; }
            set { this.authDataField = value; }
        }
    }
    
    public class RootPackageData { }
    
    public class RootAuthData { }

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

    var root = new Root();
    var auth = new RootAuthData();
    var package = new RootPackageData();
    root.AuthData = auth;
    root.PackageData = package;
    
    using (var fs = new FileStream("test.xml", FileMode.Create))
    {
        var serializer = new XmlSerializer(typeof(Root));
        serializer.Serialize(fs, root);
    }

    • Помечено в качестве ответа Sano Litch 15 февраля 2013 г. 2:42
    14 февраля 2013 г. 17:32

Все ответы

  • Привет

    По идее у вас должны сгенерироваться вложенные классы, т.е. один класс содержит объекты другого класса и тп. Этим и будет обеспечиваться иерархия в xml при сериализации xml главного root класса. Т.е. изначальная иерархия xml файла должна быть соблюдена


    Для связи [mail]

    14 февраля 2013 г. 7:10
  • Т.е. после работы xsd.exe нужно править получившийся файл с классами и организовать их в иерархическом виде? Просто шаблон безразмерный, классов очень много и реорганизовывать все это довольно проблематично...а сроки жмут...
    • Изменено Sano Litch 14 февраля 2013 г. 7:22
    14 февраля 2013 г. 7:20
  • Не, после генерации классов, у вас уже должны сгенерироваться различные типы данных, и одни типы должны содержать списки других типов если они вложены.

    После этого вы можете проверить эти классы, десериализовав исходный xml файл - Чтение XML-файлов в .NET с использованием сгенерированных по XSD-схеме классов (в конце статьи).

    Вообще генерация по xml файлу схемы xsd больше делается для последующей проверки входных xml файлов на валидность и также может быть использована для чтения xml to object. Впрочем обратная операция тоже должна быть справедлива.


    Для связи [mail]

    14 февраля 2013 г. 7:59
  • Да, я читал подобную статью...

    Проблема в том, что в сериалайзер можно прикрутить только один тип
    Вот как у меня получилось после xsd.exe:

        public partial class Root
        {
    
            private RootPackageData packageDataField;
    
            private RootAuthData authDataField;
    
            public RootPackageData PackageData
            {
                get
                {
                    return this.packageDataField;
                }
                set
                {
                    this.packageDataField = value;
                }
            }
    
            public RootAuthData AuthData
            {
                get
                {
                    return this.authDataField;
                }
                set
                {
                    this.authDataField = value;
                }
            }
        }

    ну и там еще 5 тысяч строчек)
    Я соответственно создаю экземпляры:

     private void button1_Click(object sender, EventArgs e)
            {
                var root = new Root();
                var auth = new RootAuthData();
            }
    Но как сделать так, что бы их одновременно можно было запихнуть в сериалайзер и на выходе получился xml-файл:

    <root>
       <RootAuthData>
       </RootAuthData>
    </root>

    Вот в чем вопрос у меня собственно)




    14 февраля 2013 г. 8:30
  • Допустим, имеется такой набор классов:

    public partial class Root
    {
        private RootPackageData packageDataField;
        private RootAuthData authDataField;
    
        public RootPackageData PackageData
        {
            get { return this.packageDataField; }
            set { this.packageDataField = value; }
        }
    
        public RootAuthData AuthData
        {
            get { return this.authDataField; }
            set { this.authDataField = value; }
        }
    }
    
    public class RootPackageData { }
    
    public class RootAuthData { }

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

    var root = new Root();
    var auth = new RootAuthData();
    var package = new RootPackageData();
    root.AuthData = auth;
    root.PackageData = package;
    
    using (var fs = new FileStream("test.xml", FileMode.Create))
    {
        var serializer = new XmlSerializer(typeof(Root));
        serializer.Serialize(fs, root);
    }

    • Помечено в качестве ответа Sano Litch 15 февраля 2013 г. 2:42
    14 февраля 2013 г. 17:32
  • То что надо! Огромное спасибо! Эххх...еще учиться и учиться...)
    15 февраля 2013 г. 2:42