Подход для преобразования XML в новый формат XML; Если вы используете объекты, ограничивает возможности конфигурации? - PullRequest
1 голос
/ 30 апреля 2011

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

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

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

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

Я создаю свой собственный XML-файл конфигурации, который позволит указать, какие элементы управления из экземпляра формы, которые я хочу в конечном итоге загрузить в «Стандартный формат»"object.

Экземпляр формы структурирован следующим образом:

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

Так как наша цель - не работать с объектом Standard Format, а завершитьв дополнение к тому, что он сериализует, могу ли я вырезать объект и просто смоделировать его в соответствии с желаемым 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 в этом случае считался актером, он может идти в «» в стандартном объекте формата, или он может быть вложен в что-то еще, например «».У меня есть несколько форм, но все «элементы управления» в каждой форме будут иметь одинаковый вывод.Так что в этом случае основная форма будет иметь кучу разных людей, которые должны выходить в одном и том же формате.

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

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

1 Ответ

1 голос
/ 30 апреля 2011

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

Если ваши данные основаны на объектах, вы можете увидеть, выполняет ли XmlAttributeOverrides (который вы можете передать XmlSerializer) то, что вам нужно;он допускает карты XML, которые не связаны с атрибутами кода, и, таким образом, допускает параллельные карты для той же модели - но он не столь же богат, как развертка xslt;и вы должны быть осторожны, чтобы кэшировать и повторно использовать любые экземпляры XmlSerializer, созданные с использованием XmlAttrributeOverrides, иначе это приведет к утечке несобираемых динамических сборок.

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