Подход для преобразования XML в новый формат XML; При использовании объектов ограничивает способности конфигурации?

StackOverflow https://stackoverflow.com/questions/5843717

Вопрос

Есть вопрос относительно подхода к преобразованию XML из одного формата в другой.

Я работаю над задачей, в которой я беру сериализованные данные из объекта, который я не контролирую. Я сгенерировал объект для этого XML. Давайте назвали это «экземпляр формы». Форма очень сложна с помощью гнездования, и множество неактуальных компонентов макета и гнездования, которые, на мой взгляд, затрудняет использование XSLT для этого.

Мне нужно взять экземпляр формы и назначить свойства из нее - значениям в другом объекте. Давайте назовем другой объект «стандартный формат». Стандартный объект формата сериализует себя в формате, который мне нужен, чтобы в конечном итоге добраться.

Экземпляр формы является полученной сериализацией от пользователя, заполняющего форму. Эта форма «определение» может быть изменено в любое время, и что -то такое простое, как изменение макета в форму, полностью изменяя структуру гнездования результирующей сериализации - что последовательно, так это то, что где -то в контроле сериализации представлено, что мне нужны значения от - и i Хочу настроить, какие из них я хочу, чтобы значения.

Я создаю свой собственный «файл конфигурации» 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 поля могут изменить позицию/гнездование в сериализации «экземпляр формы» в любое время, если кто -то изменит определение базовой формы, которая определена.

Поскольку наша цель не в том, чтобы работать со стандартным объектом формата, но в конечном итоге, что он сериализует, могу ли я вырезать объект и просто моделировать к XML, который я хочу. Например, это то, что будет производить стандартный формат, если бы я добавил в него объект «человек».

<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>

Желаемый выход может измениться без модели «Стандартного формата», необходимой для изменения. Если человек в этом случае рассматривался как актер, он может оказаться под «» в стандартном объекте формата, или он может быть вложенным под чем -то другим, например, «». У меня есть несколько форм, но все «элементы управления» в каждой форме будут иметь одинаковый выход. Таким образом, в этом случае в основной форме будет группа разных людей, которые должны выйти в одном и том же формате.

Так что плохо, если я обновлюсь по стандартному объекту формата, если в конечном итоге все, что нам нужно, - это выход сериализации?

Спасибо за любые идеи.

Это было полезно?

Решение

Лично я думаю, что XSLT по -прежнему ваш лучший выбор здесь; Это действительно очень универсально для XML -преобразований.

Если ваши данные основаны на объекте, вы можете увидеть, делает ли xmlattributeverrides (которые вы можете подавать в XMLSerializer), что вам нужно; Это позволяет XML -карты, которые не связаны с атрибутами кода, и, таким образом, позволяют параллельные карты для той же модели - но это нет так же богат, как развертка XSLT; И вы должны быть осторожны, чтобы кэшировать и повторно использовать любые экземпляры XMLSerializer, созданные с использованием xmlattrributeOverrides, или он протечет невозможные динамические сборки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top