Approche de transformation XML à nouveau format XML; Si vous utilisez des objets, des capacités de configuration des limites?

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

Question

Vous avez une question concernant une approche de transformation XML d'un format à l'autre.

Je travaille sur une tâche dans laquelle je prends des données sérialisées à partir d'un objet que je n'ai pas le contrôle. J'ai généré un objet pour ce XML. Lets appelé cela le « Formulaire d'instance ». Instance forme est très compliquée avec l'imbrication, et beaucoup de composants de mise en page et hors de propos d'imbrication que ma compréhension rend difficile à utiliser XSLT pour cela.

Je dois prendre l'exemple de formulaire, et les propriétés de ce Assigner - à des valeurs dans un autre objet. Appelons l'autre objet « Format Standard ». L'objet de format standard lui-même sérialise au format que je dois finalement arriver à.

Le formulaire instance est la sérialisation résultant d'un utilisateur remplissant un formulaire. Ce formulaire « définition » peut être modifiée à tout moment et quelque chose d'aussi simple qu'un changement de mise en page à la forme change complètement la structure d'imbrication de la sérialisation résultant - ce qui est cohérent est que quelque part dans les sérialisation contrôles sont représentés que j'ai besoin des valeurs de - et je à configurer que ceux que je veux que les valeurs de.

Je crée mon propre XML « Fichier de configuration », qui permettra à la spécification dont les contrôles du formulaire d'instance que je veux finalement avoir chargé dans l'objet « Format standard ».

Formulaire instance est structuré comme suit:

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

Comme vous pouvez le voir, je ne me dérange pas vraiment où existent les champs en instance forme (et il peut changer à tout moment si quelqu'un supprime un en-tête de groupe ou ajoute une nouvelle mise en page) que je peux obtenir les récursive si je crée une configuration fichier avec le « nom » de contrôle.

Je voudrais faire mon « fichier de configuration », assez réutilisable dans le sens que - lorsque les données sont ajoutées à la « instance Form » - un ajustement peut être fait à mon fichier de configuration, en disant: « Je veux maintenant ce un autre contrôle qui a été ajouté à la définition de formulaire », qui va écrire au « Format standard ». En outre, la sortie finale, je voudrais être configurable à partir de ce fichier ainsi.

sérialisation dans l'objet « Format Standard » me fait ce que je dois - si je travaille avec elle dans un spécifique moyen de ce que je suis en train de finir avec (il est flexible). Cependant, je me demande, comment je peux faire comment le placement de mes données d'instance formulaire dans cet objet - configurable. Si je travaille avec elle comme un objet, puis lorsque le résultat des besoins de format de sérialisation pour changer je dois code de changement.

Suis-je tort de penser que, puisque je sais ce que les sorties de l'objet « Format standard », que je peux créer une section de configuration comme jeton dans mon « fichier de configuration » pour permettre la spécification du format?

Par exemple: Sur mon « instance Formulaire » J'ai au moins 2 champs que je veux avoir finalement représenté dans ce que sérialisés « Format standard » à. Ces 2 champs peuvent changer de position / imbrication dans le moment de sérialisation « instance formulaire » si quelqu'un modifie la définition de la forme sous-jacente qui est définie.

Étant donné que notre objectif est de ne pas travailler avec l'objet Format standard, mais finissent avec ce qu'il sérialise, puis-je couper l'étape d'objet et sur le modèle juste vers le XML que je veux. Par exemple, c'est ce que le format standard produirait si j'ai ajouté un objet « Personne » à elle.

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

Serait-il approche OK pour rendre mon fichier XML de configuration comme ceci:

<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 sortie souhaitée peut changer sans le modèle « Format standard » besoin de changement. Si personne dans ce cas a été considéré comme un acteur, il peut passer sous « » dans l'objet de format standard, ou il pourrait être imbriqué sous quelque chose d'autre comme « ». J'ai plusieurs formes, mais tous les « contrôles » dans chaque forme aura le même sortie. Donc, dans ce cas, la principale forme aura un tas de personnes différentes tous besoin de sortir dans le même format.

Alors est-ce mauvais si je vais autour de l'objet Format Standard, si, finalement, tous nous avons besoin est une sérialisationsortie?

Merci pour toutes les idées.

Était-ce utile?

La solution

Personnellement, je pense que xslt est encore votre meilleur pari ici; il est vraiment très polyvalent pour XML transforme.

Si vos données sont basées sur les objets, vous pouvez voir si XmlAttributeOverrides (que vous pouvez nourrir à XmlSerializer) fait ce que vous avez besoin; il permet des cartes XML qui sont sans rapport avec les attributs de code, et permet ainsi des cartes parallèles pour le même modèle - mais il est pas aussi riche comme un balayage xslt; et vous devez être prudent dans le cache et réutiliser des instances de XmlSerializer créées à l'aide XmlAttrributeOverrides, ou fuiront assemblages dynamiques irrécouvrable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top