Ansatz zum Umwandeln von XML in ein neues XML -Format; Wenn Sie Objekte verwenden, begrenzt die Konfigurationsfähigkeiten?

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

Frage

Haben Sie eine Frage zu einem Ansatz zur Transformation von XML von einem Format in ein anderes.

Ich arbeite an einer Aufgabe, bei der ich serialisierte Daten von einem Objekt nehme, über das ich keine Kontrolle habe. Ich habe ein Objekt für diese XML generiert. Nennen wir dies die "Forminstanz". Die Forminstanz ist sehr kompliziert mit dem Nestieren, und viele irrelevante Layoutkomponenten und das Verschachteln, die mein Verständnis schwierig machen, XSLT dafür zu verwenden.

Ich muss die Formularinstanz annehmen und Werte in einem anderen Objekt Eigenschaften zuweisen. Nennen wir das andere Objekt "Standardformat". Das Standardformatobjekt serialisiert sich in das Format, das ich letztendlich erreichen muss.

Die Formularinstanz ist die resultierende Serialisierung eines Benutzers, der ein Formular ausfüllt. Diese Form "Definition" kann jederzeit geändert werden und etwas so Einfaches wie eine Layoutänderung an der Form verändert die Verschachtelungsstruktur der resultierenden Serialisierung vollständig - was konsistent ist, dass irgendwo in den Serialisierungskontrollen dargestellt wird, dass ich Werte benötige - und i Möchten Sie konfigurieren, von welchen Werten die Werte haben möchten.

Ich erstelle meine eigene XML -Konfigurationsdatei, mit deren Angaben die Steuerelemente aus der Formularinstanz, die ich letztendlich in das Objekt "Standardformat" geladen habe.

Forminstanz ist so strukturiert:

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

Wie Sie sehen können, macht es mir nichts aus, wo die Felder in Formularinstanz existieren (und es kann sich jederzeit ändern, wenn jemand einen Gruppenheader entfernt oder ein neues Layout hinzufügt) Kontrolle "Name".

Ich möchte meine "Konfigurationsdatei" erstellen, die in dem Sinne wiederverwendbar genug ist, dass - wenn Daten zur "Formularinstanz" hinzugefügt werden - eine Anpassung an meine Konfigurationsdatei vorgenommen werden kann. "Ich möchte jetzt diese andere Steuerung welcher wurde der Formulardefinition hinzugefügt, die sie in das "Standardformat" schreibt. Auch die ultimative Ausgabe, die ich auch aus dieser Datei konfigurierbar sein möchte.

Die Serialisierung im Objekt "Standardformat" bringt mir das, was ich brauche - wenn ich so arbeite, dass ich spezifisch für das, mit dem ich versuche, zu enden (es ist flexibel). Ich frage mich jedoch, wie ich wie die Platzierung meiner Forminstanzdaten in dieses Objekt - konfigurierbar ist. Wenn ich damit als Objekt arbeite, muss ich, wenn das resultierende Serialisierungsformat sich ändern muss, den Code ändern.

Ist ich falsch darüber nachzudenken, dass ich, da ich weiß, was das Objekt "Standardformat" ausgibt, in meiner "Konfigurationsdatei" einen tokenähnlichen Konfigurationsabschnitt erstellen kann, um die Spezifikation des Formats zu ermöglichen?

Zum Beispiel: Auf meiner "Forminstanz" habe ich mindestens 2 Felder, die ich irgendwann in dem "Standard -Format" dargestellt haben möchte, zu dem ich serialisiert. Diese 2 Felder können die Position/Nistung in der Serialisierung "Forminstanz" jederzeit ändern, wenn jemand die Definition der definierten zugrunde liegenden Form ändert.

Da unser Ziel nicht darin besteht, mit dem Standardformatobjekt zu arbeiten, sondern mit dem, was es serialisiert, kann ich das Objektschritt ausschneiden und einfach auf die gewünschte XML -XML -MODEL modellieren. Dies ist beispielsweise das, was das Standardformat erzeugen würde, wenn ich ein "Person" -Objekt hinzuzufügen würde.

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

Wäre es in Ordnung, meine XML -Konfigurationsdatei wie folgt zu machen:

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

Die gewünschte Ausgabe kann sich ändern, ohne dass sich das Modell "Standardformat" ändern muss. Wenn die Person in diesem Fall als Schauspieler betrachtet wurde, kann sie im Standardformatobjekt unter "" gehen oder unter etwas anderem wie "" verschachtelt werden. Ich habe mehrere Formen, aber alle "Steuerelemente" in jedem Formular haben die gleiche Ausgabe. In diesem Fall hat die Hauptform eine Reihe verschiedener Personen, die alle im selben Format herauskommen müssen.

Ist es also schlecht, wenn ich das Standardformatobjekt umgehe, wenn letztendlich nur wir nur eine Serialisierungsausgabe brauchen?

Vielen Dank für alle Ideen.

War es hilfreich?

Lösung

Persönlich denke ich, dass XSLT hier immer noch die beste Wahl ist. Es ist wirklich sehr vielseitig für XML -Transformationen.

Wenn Ihre Daten objektbasiert sind, können Sie sehen, ob xmlattributeOverrides (die Sie mit XMLSerializer füttern können) das tut, was Sie benötigen. Es ermöglicht XML -Karten, die nicht mit den Codeattributen zu tun haben, und ermöglicht somit parallele Karten für dasselbe Modell - aber es ist nicht so reich wie ein XSLT -Sweep; und Sie müssen darauf achten, dass XMLSerializer -Instanzen, die mit XMLATTRibuteOverrides erstellt wurden, einsetzen und uneinbringliche dynamische Ansammlungen auslaufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top