Enfoque para transformar XML en nuevo formato XML; Si usa objetos, limita las habilidades de configuración?

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

Pregunta

Tenga una pregunta sobre un enfoque para transformar XML de un formato a otro.

Estoy trabajando en una tarea en la que estoy tomando datos serializados de un objeto sobre el que no tengo control. He generado un objeto para este XML. Llamamos a esto la "instancia de formulario". La instancia de formulario es muy complicada con la anidación, y muchos componentes de diseño irrelevantes y anidación, lo que mi comprensión hace que sea difícil usar XSLT para esto.

Necesito tomar la instancia de formulario y asignar propiedades de ella, a valores en otro objeto. Llamemos al otro objeto "formato estándar". El objeto de formato estándar se serializa al formato al que necesito llegar en última instancia.

La instancia del formulario es la serialización resultante de un usuario que llena un formulario. Esta "definición" de la forma se puede cambiar en cualquier momento y algo tan simple como un cambio de diseño a la forma cambia por completo la estructura de anidación de la serialización resultante; lo que es consistente es que en algún lugar de los controles de serialización se representan que necesito valores de - y yo quiero configurar de cuáles quiero los valores.

Estoy creando mi propio "archivo de configuración" XML, que permitirá la especificación de qué controles desde la instancia de formulario que quiero haber cargado en el objeto "Formato estándar".

La instancia de formulario está estructurada de esta manera:

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

Como puede ver, no me importa realmente dónde existen los campos en la instancia de formulario (y puede cambiar en cualquier momento si alguien elimina un encabezado de grupo o agrega un diseño nuevo), ya que puedo llegar de manera recursiva si creo un archivo de configuración con el Control "Nombre".

Me gustaría hacer mi "archivo de configuración", reutilizar lo suficiente en el sentido de que, cuando los datos se agregan a la "instancia de formulario", se puede hacer un ajuste a mi archivo de configuración, diciendo "Ahora quiero este otro control que se agregó a la definición de formulario "que la escribirá en el" formato estándar ". Además, la salida final que también me gustaría ser configurable de este archivo.

La serialización en el objeto "Formato estándar" me da lo que necesito: si trabajo con él de una manera específica para lo que estoy tratando de terminar (es flexible). Sin embargo, me pregunto cómo puedo hacer cómo la ubicación de los datos de mi instancia de formulario en ese objeto, configurable. Si trabajo con él como un objeto, cuando el formato de serialización resultante debe cambiar, necesito cambiar el código.

¿Me equivoco al pensar que, dado que sé qué salidas del objeto "Formato estándar", puedo crear una sección de configuración similar a token en mi "archivo de configuración" para permitir la especificación del formato?

Por ejemplo: en mi "instancia de formulario", tengo al menos 2 campos que quiero haber representado en lo que se escreñora el "formato estándar". Estos 2 campos pueden cambiar la posición/anidación en la serialización de "instancia de formulario" en cualquier momento si alguien cambia la definición de la forma subyacente que se define.

Dado que nuestro objetivo no es funcionar con el objeto de formato estándar, sino que termine con lo que es serializa, ¿puedo cortar el objeto y simplemente modelar hacia el XML que quiero? Por ejemplo, esto es lo que produciría el formato estándar si le agregué un objeto "persona".

<StandardFormat>
  <Person Gender="M">
    <Name>
      <First>Joe</First>
      <Last>Smith</Last>
    </Name>
  </Person>
</StandardFormat>

¿Estaría bien un enfoque para hacer mi archivo de configuración XML así?

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

La salida deseada puede cambiar sin el modelo de "formato estándar" que necesita cambiar. Si la persona en este caso se considerara actor, puede pasar "" en el objeto de formato estándar, o podría anidarse bajo algo más como "". Tengo múltiples formularios, pero todos los "controles" en cada forma tendrán la misma salida. Entonces, en este caso, el formulario principal tendrá un montón de personas diferentes que necesitan salir en el mismo formato.

Entonces, ¿es malo si doy la vuelta al objeto de formato estándar, si, en última instancia, todo lo que necesitamos es una salida de serialización?

Gracias por cualquier idea.

¿Fue útil?

Solución

Personalmente, creo que XSLT sigue siendo tu mejor apuesta aquí; Realmente es muy versátil para las transformaciones XML.

Si sus datos se basan en objetos, puede ver si XMLATTRIBUDEVERRIDE (que puede alimentar a XMLSerializer) hace lo que necesita; Permite mapas XML que no están relacionados con los atributos del código y, por lo tanto, permite mapas paralelos para el mismo modelo, pero es no tan rico como un barrido XSLT; Y debe tener cuidado de almacenar en caché y reutilizar cualquier instancia XMLSerializer creada con XMLATTRIBUTEDOVERRIDES, o filtrará ensamblajes dinámicos incobrables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top