Подход для преобразования XML в новый формат XML; Если вы используете объекты, ограничивает возможности конфигурации?
Задайте вопрос о подходе к преобразованию XML из одного формата в другой.
Я работаю над задачей, в которой я беру сериализованные данные из объекта, над которым у меня нет контроля. Я сгенерировал объект для этого XML. Давайте назовем это "экземпляром формы". Экземпляр формы очень сложен с вложением, множеством несоответствующих компонентов макета и вложением, которые, насколько я понимаю, затрудняют использование XSLT для этого.
Мне нужно взять экземпляр Form и присвоить ему свойства - значениям в другом объекте. Позволяет назвать другой объект "Стандартный формат". Объект стандартного формата сериализует себя в тот формат, который мне нужен в конечном итоге.
Экземпляр формы - это полученная в результате сериализация от пользователя, заполняющего форму. Это "определение" формы может быть изменено в любое время, и что-то столь же простое, как изменение макета в форме, полностью меняет структуру вложенности получаемой сериализации. То, что является последовательным, заключается в том, что где-то в элементах сериализации представлены элементы управления, для которых мне нужны значения - и я хочу настроить, из каких я хочу значения.
Я создаю свой собственный XML-файл "Файл конфигурации", который позволит указать, какие элементы управления из экземпляра формы я хочу в конечном итоге загрузить в объект "Стандартный формат".
Экземпляр формы имеет следующую структуру:
<Form name="MainForm">
<Control type="GroupHeader">
<Control type="GroupHeader">
<Control type="text" name="FirstName"/>
<Control type="text" name="LastName"/>
</Control>
<Control type="Radio" name="Gender"/>
</Control>
<Control>
<Form name="SomeOtherSubForm">
<Control type="text" name="AnotherPersonFirstName"/>
<Control type="text" name="AnotherPersonLastName"/>
</Form>
</Control>
</Form>
Как вы можете видеть, я не возражаю против того, где существуют поля в экземпляре формы (и он может измениться в любое время, если кто-то удалит заголовок группы или добавит новый макет), поскольку я могу получить их рекурсивно, если я создаю файл конфигурации с Контроль "имя".
Я хотел бы сделать мой "Файл конфигурации" достаточно пригодным для повторного использования в том смысле, что - когда данные добавляются в "Экземпляр формы" - в мой файл конфигурации можно внести корректировку, говоря: "Теперь я хочу этот другой элемент управления, который был добавлен в определение формы ", который запишет его в" стандартный формат ". Кроме того, окончательный вывод, который я хотел бы настроить из этого файла.
Сериализация в объекте "Стандартный формат" дает мне то, что мне нужно - если я работаю с ним таким образом, который специфичен для того, что я пытаюсь закончить (это гибко). Однако мне интересно, как я могу сделать так, чтобы размещение данных моего экземпляра формы в этом объекте - настраивалось. Если я работаю с ним как с объектом, то когда нужно изменить формат получаемой сериализации, мне нужно изменить код.
Я ошибаюсь, полагая, что, поскольку я знаю, что выводит объект "Стандартный формат", я могу создать токеноподобный раздел конфигурации в своем "Конфигурационном файле", чтобы разрешить спецификацию формата?
Например: в моем "Экземпляре формы" у меня есть как минимум 2 поля, которые я хочу в конечном итоге представить в том, к чему сериализуется "Стандартный формат". Эти 2 поля могут изменить положение / вложенность в сериализации "Form Instance" в любое время, если кто-то изменит определение базовой формы, которая определена.
Поскольку наша цель не в том, чтобы работать с объектом стандартного формата, а в конечном итоге с тем, что он сериализует, могу ли я вырезать объект и просто смоделировать его в соответствии с желаемым XML. Например, это то, что выдает стандартный формат, если я добавлю к нему объект Person.
<StandardFormat>
<Person Gender="M">
<Name>
<First>Joe</First>
<Last>Smith</Last>
</Name>
</Person>
</StandardFormat>
Будет ли нормально сделать мой XML-файл конфигурации следующим образом:
<FormInstanceOutputConfiguration>
<Control id="FirstName" type="TextField">
<Control id="LastName" type="TextField">
<Control id="Gender" type="Radio">
<CustomOutputTemplate>
<Person Gender="[Gender]">
<Name>
<First>[FirstName]</First>
<Last>[LastName]</Last>
</Name>
</Person>
</CustomOutputTemplate>
</FormInstanceOutputConfiguration>
Требуемый результат может быть изменен без необходимости изменения модели "Стандартный формат". Если Person в этом случае считался актером, он может идти в "" в объекте стандартного формата, или он может быть вложен в что-то еще, например "". У меня есть несколько форм, но все "элементы управления" в каждой форме будут иметь одинаковый вывод. Таким образом, в этом случае основная форма будет состоять из разных лиц, которые должны будут выходить в одном формате.
Так что плохо, если я обойду объект Standard Format, если в конечном итоге все, что нам нужно, это вывод сериализации?
Спасибо за любые идеи.
1 ответ
Лично я думаю, что xslt все еще ваш лучший выбор здесь; это действительно очень универсально для преобразований XML.
Если ваши данные основаны на объектах, вы можете увидеть, выполняет ли XmlAttributeOverrides (который вы можете передать XmlSerializer) то, что вам нужно; он допускает карты XML, которые не связаны с атрибутами кода, и, следовательно, допускает параллельные карты для одной и той же модели, но он не настолько богат, как развертка xslt; и вы должны быть осторожны, чтобы кэшировать и повторно использовать любые экземпляры XmlSerializer, созданные с использованием XmlAttrributeOverrides, иначе это приведет к утечке несобираемых динамических сборок.