2015-06-29 2 views
3

Я пишу синтаксический анализатор XSD, который будет использоваться для создания элементов управления asp.net в форме в соответствии с анализируемым XSD.Какие шаблоны проектирования следует использовать при написании парсера?

XSD загружается из какого-либо места (например, из БД) в объект XsdSchema, а затем с использованием классов .NET (Object Object Model) для чтения элементов этой схемы для создания списка элементов управления, которые должны отображаться на форма.

Какие шаблоны вы считаете лучшими для использования в этом сценарии?

(В настоящее время я создал классы для представления различных видов контролей -Text, даты, списка и т.д., и мой класс XSD анализатора имеет метод, который возвращает список тех классов, в соответствии с анализируемой XSD.

Эти классы «Ui Element» были созданы, чтобы каким-то образом, чтобы не связать парсер asp.net слоя)

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

Спасибо.

ответ

1

TL; DR: шаблон для посетителей (двойная отправка) и шаблон Intepreter (рекурсивная функция) могут использоваться для перевода деревьев (композитный рисунок), в вашем случае, дерева элементов формы в дерево управления пользовательского интерфейса. Here is a smart article on that.

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

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

Это можно сделать, пройдя дерево формы - перечисляя узлы в определенном порядке, создавая элемент управления пользовательского интерфейса для каждого узла и создавая дерево элементов управления пользовательского интерфейса.

Два шаблона, которые приходят на ум здесь, являются Посетитель (двойная отправка) и Intepreter (рекурсивная функция). Вот some tutorial - он находится на Java, который можно перевести на C#.

Update: Хорошее описание шаблона Visitor, как применяется для разбора деревьев:

How to write the Visitor Pattern for Abstract Syntax Tree in Python?

Каждый узел в вашем AST будет необходимо внедрить принять() метод (НЕ визит ()). В качестве аргумента метод принимает объект-посетитель. В реализации этого метода accept() вы вызываете метод посещения() объекта-посетителя (будет один для каждого типа узла AST, в Java вы будете использовать перегрузку параметра в Python, я полагаю, вы можете использовать разные посетите методы _ *()).

Смежные вопросы