Надеемся на легкое заполнение классов, сгенерированных из XSD, где DataSet имеет другую схему - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть данные в базе данных в одной схеме, которые мне нужно преобразовать в XML другой схемы.

XML - это собственная система сообщений / ответов сторонних производителей.У нас есть доступ к справочному документу, в котором дается разбивка всех сущностей и сложных типов, и у нас есть XSD-документы.Потенциально существуют сотни различных вариантов запросов XML-документов, поскольку элементы 2-го и 3-го уровня содержат индикаторы выбора в диапазоне от 2 до 200.

Используемый в настоящее время метод - это метод грубой силы - запрос, чтобы получить всеЗатем данные в объект DataSet (с помощью справочного документа) вручную генерируют XML, объединяя данные в строку.Этот подход работает для 2 или 3 вариантов, которые нам нужны.

Теперь, когда мы хотим поддержать больше вариантов, мы хотим отойти от подхода грубой силы.У нас также есть несколько версий, но мы используем самую поддерживаемую версию, и мы хотели бы подойти к решению с учетом масштабируемости.

Что мы сделали? Мы сгенерировали классы из документа XSD, который дал нам 2300 + частичных классов.Я начал разработку библиотеки методов заполнения для каждого объекта класса, который использует объект координат (таблица, столбец, свойства строки) для конкретных данных в наборе данных.Но, понимая, что для заполнения координатных объектов нам потребуется просмотреть данные, возникает вопрос: почему бы просто не заполнить фактический объект XML в это время?

Было бы меньше проблем, если бы каждую из таблиц набора данных можно было сопоставить с одним объектом XML, однако данные для одного объекта, вероятно, распределены по нескольким таблицам.

Idea 1

В последнее время я размышляю над комбинацией Factory / Builder для создания / заполнения объектов xml.

Idea 2

Еще одна идея, которая у меня была, заключалась в том, чтобы включить систему атрибутов свойств, которая имеет имя таблицы, имя столбца - это приводит к проблеме, когда один и тот же объект xml получает идентичное свойство из 2 разных мест в DataSet на основеВыбор элементов 2-го или 3-го уровня.Всегда можно добавить другой указатель (тип выбора?) И затем иметь несколько атрибутов для свойства.

Idea 3

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

Решения сторонних производителей не совсем исключены.Я ищу предложения о том, как подойти к этой проблеме.

ОБНОВЛЕНИЕ: сгенерированный XML записывается в файл и затем используется сторонним приложением.

1 Ответ

0 голосов
/ 14 мая 2019

Мы определились с идеей 1 и идеей 2.
XSD сгенерировал классы с номером 2300+, которые будут использоваться для создания заполненного корневого объекта, который мы можем передать классу XmlSerializer. Он сгенерирует xml, который мы должны передать стороннему инструменту.

Корневой и верхний 2-й уровни объектов класса будут создаваться с помощью шаблонов Builder и Factory Design. Мы будем использовать копии сгенерированных частичных классов для добавления функциональности через интерфейсы или базовые классы.

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://temp")]
[System.Xml.Serialization.XmlRootAttribute("NumberType", Namespace = "http://temp", IsNullable = false)]    
public partial class IdGroup
{

    private string idField;

    private string valueField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string id
    {
        get
        {
            return this.idField;
        }
        set
        {
            this.idField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlTextAttribute()]
    [CustomPropertyAttribute("TableName", "ColumnName", Level2Type)]
    [CustomPropertyAttribute("AltTableName", "AltColumnName", AltLevel2Type)]
    public string Value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField = value;
        }
    }
}

public partial class IdGroup : IExtendFunctionality
{ }

Я понял, что этот вопрос довольно открыт для интерпретации и поэтому, вероятно, был не очень хорошим вопросом. Я прошу прощения за это.

Спасибо всем, кто зашел посмотреть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...