Approccio per trasformare XML in nuovo formato XML; Se si utilizzano oggetti, limita le capacità di configurazione?

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

Domanda

Avere una domanda riguardante un approccio alla trasformazione di XML da un formato all'altro.

Sto lavorando a un compito in cui sto prendendo dati serializzati da un oggetto su cui non ho il controllo. Ho generato un oggetto per questo XML. Lascia che lo chiamasse "l'istanza del modulo". L'istanza del modulo è molto complicata dalla nidificazione e molti componenti di layout irrilevanti e nidificazione che la mia comprensione rende difficile usare XSLT per questo.

Devo prendere l'istanza del modulo e assegnare proprietà da essa - ai valori in un altro oggetto. Chiamiamo l'altro "formato standard". L'oggetto di formato standard si basa sul formato a cui ho bisogno per arrivare.

L'istanza del modulo è la serializzazione risultante da un utente che compila un modulo. Questa forma di "definizione" può essere modificata in qualsiasi momento e qualcosa di semplice come una modifica del layout nella forma cambia completamente la struttura di nidificazione della serializzazione risultante - ciò che è coerente è che da qualche parte nei controlli di serializzazione sono rappresentati che ho bisogno di valori da - e i voglio configurare da quali voglio i valori.

Sto creando il mio "file di configurazione" XML, che consentirà a quali controlli dall'istanza del modulo che voglio in definitiva hanno caricato nell'oggetto "Formato standard".

L'istanza del modulo è strutturata in questo modo:

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

Come puoi vedere non mi dispiace davvero dove esistono i campi nell'istanza del modulo (e può cambiare in qualsiasi momento se qualcuno rimuove un'intestazione di gruppo o aggiunge un nuovo layout) poiché posso raggiungerli in modo ricorsivo se creo un file di configurazione con il Controlla "nome".

Vorrei fare il mio "file di configurazione", riutilizzabile abbastanza nel senso che - quando i dati vengono aggiunti all'istanza del "modulo" - è possibile effettuare una regolazione al mio file di configurazione, dicendo "Ora voglio questo altro controllo che è stato aggiunto alla definizione del modulo "che lo scriverà al" formato standard ". Inoltre, anche l'output finale che vorrei essere configurabile da questo file.

La serializzazione nell'oggetto "Formato standard" mi ottiene ciò di cui ho bisogno - se ci lavoro in un modo specifico per ciò che sto cercando di finire (è flessibile). Comunque mi chiedo, come posso fare come il posizionamento dei miei dati di istanza di forma in quell'oggetto - configurabile. Se lavoro con esso come oggetto, quando il formato di serializzazione risultante deve cambiare, devo cambiare il codice.

Ho torto nel pensare che da quando so quale sia il "formato standard" sugli oggetti, che posso creare una sezione di configurazione simile a un token nel mio "file di configurazione" per consentire la specifica del formato?

Ad esempio: nella mia "istanza del modulo" ho almeno 2 campi che alla fine ho rappresentato in quale "formato standard" serializza. Questi 2 campi possono cambiare posizione/nidificazione nella serializzazione "istanza del modulo" in qualsiasi momento se qualcuno cambia la definizione della forma sottostante definita.

Poiché il nostro obiettivo non è funzionare con l'oggetto di formato standard, ma finire con ciò che serializza, posso tagliare l'oggetto e solo modellare verso XML che desidero. Ad esempio, questo è ciò che il formato standard produrrebbe se avessi aggiunto un oggetto "persona" ad esso.

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

Sarebbe ok approccio per creare il mio file di configurazione XML come questo:

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

L'output desiderato può cambiare senza il modello "Formatto standard" che deve cambiare. Se la persona in questo caso fosse considerata come attore, può andare sotto "" nell'oggetto di formato standard, oppure potrebbe essere nidificata sotto qualcos'altro come "". Ho più forme, ma tutti i "controlli" in ogni forma avranno lo stesso output. Quindi, in questo caso, la forma principale avrà un sacco di persone diverse che hanno bisogno di uscire nello stesso formato.

Quindi è male se vado in giro all'oggetto di formato standard, se alla fine tutto ciò di cui abbiamo bisogno è un output di serializzazione?

Grazie per qualsiasi idea.

È stato utile?

Soluzione

Personalmente penso che XSLT sia ancora la soluzione migliore qui; È davvero molto versatile per le trasformazioni XML.

Se i tuoi dati sono basati su oggetti, potresti vedere se xmlattributeOverrides (che puoi alimentare a xmlserializer) fa ciò di cui hai bisogno; Consente mappe XML non correlate agli attributi del codice e quindi consente mappe parallele per lo stesso modello, ma lo è non ricco come una sweep XSLT; E devi fare attenzione a memorizzare nella cache e riutilizzare eventuali istanze XMLserializer create utilizzando XMLATRRRRIBUTEOVERRIDES, oppure perderà assemblaggi dinamici non collegabili.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top