convertire i record di file flat in xml in java


Ho uno scenario in cui i record di dipendenti scritti in file flat, qualcosa come:

flatFile.txt
============
1|name1|dept1|10000
2|name2|dept2|12000
3|name3|dept3|9500
....
....

Ora voglio leggere questo file flat e convertire i record dei dipendenti sopra in un nuovo file xml ogni volta, quindi alla fine dovrei avere il file xml con i seguenti dati:

<EMPLOYEES>
    <EMPLOYEE>
        <ID>1</ID>
        <NAME>name1</NAME>
        <DEPARTMENT>dept1</DEPARTMENT>
        <SALARY>10000</SALARY>
         </EMPLOYEE>
    <EMPLOYEE>
        <ID>2</ID>
        <NAME>name2</NAME>
        <DEPARTMENT>dept2</DEPARTMENT>
        <SALARY>12000</SALARY>
         </EMPLOYEE>
         ...
         ...
</EMPLOYEES>

Ora per implementare questo concetto devo occuparmi delle convalide dei dati come:

  1. id e stipendio dovrebbero essere numerici
  2. la lunghezza del nome deve essere inferiore a 20
  3. una singola riga di un file flat dovrebbe contenere sopra 4 campi

Se una qualsiasi delle convalide fallisce, deve essere riflessa nel file xml insieme al numero di riga di errore, qualcosa come:

<NAME type="Error" Line="2"></NAME> (name length is greater than 20 in 2nd record of a flat file)

O

<EMPLOYEE type="Error" Line="1"></EMPLOYEE> (first record doesn't contains enough fields)

Ora le applicazioni devono essere progettate in modo tale che i componenti siano collegabili con alternative. Ad esempio, dovrebbe essere possibile sostituire il parser utilizzato per analizzare un file di input sulla base del delimitatore con un altro che analizza come lunghezza fissa.

Quindi in qualche modo dovrò progettare il concetto in modo stratificato come

Parsing -> Validation -> Output Generation.

Ora per implementare questo concetto ho dato un pensiero, che è il seguente:

  1. Leggi tutti i record dal file usando BufferedReader e tokenizzalo usando StringTokenizer.
  2. Inizializza l'oggetto employee per ogni record e aggiungilo in una raccolta (Elenco).
  3. Mantiene gli errori (mancata corrispondenza dei campi o qualsiasi altra convalida non riuscita) in Mappa>.
  4. Scrivere o marshallare l'elenco in xml utilizzando alcune API XML Builder (non è chiaro quale sarebbe il migliore).

Qualcuno può darmi il suggerimento migliore o qualche suggerimento per ottenere l'implementazione ?

Author: kleopatra, 2012-09-16

2 answers

Farei quanto segue usando le librerie disponibili nel JDK/JRE da Java SE 6.

  1. Creare uno StAX (JSR-173) XMLStreamWriter per l'output del contenuto XML in un file.
  2. Usa XMLStreamWriter per scrivere l'elemento radice.
  3. Leggi la riga successiva del tuo input
  4. Convertirlo in un oggetto Employee
  5. Usa JAXB (JSR-222) per eseguire il marshalling dell'oggetto su XMLStreamWriter
  6. Se c'è un'altra riga ripetere il passaggio 3.
  7. Utilizzare il XMLStreamWriter per terminare il documento.

AGGIORNAMENTO

Ci sono diverse opzioni per eseguire la convalida effettiva, di seguito mostrerò come rappresentare le informazioni risultanti in un modello a oggetti che un'implementazione JAXB potrebbe utilizzare per produrre il risultato desiderato.

Dipendente

package forum12446506;

import javax.xml.bind.annotation.*;

@XmlRootElement(name="EMPLOYEE")
public class Employee {

    @XmlAttribute(name="Line")
    Integer line;

    @XmlAttribute
    String type;

    @XmlElement(name="ID")
    Value id;

    @XmlElement(name="NAME")
    Value name;

    @XmlElement(name="DEPARTMENT")
    Value department;

    @XmlElement(name="SALARY")
    Value salary;

    public Employee() {
    }

    public Employee(int line, String type) {
        this.line = line;
        this.type = type;
    }

}

Valore

package forum12446506;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class Value {

    @XmlAttribute(name="Line")
    Integer line;

    @XmlAttribute
    String type;

    @XmlValue
    String value;

    public Value() {
    }

    public Value(Integer line, String type, String value) {
        this.line = line;
        this.type = type;
        this.value = value;
    }

}

Uscita

<EMPLOYEE>
    <ID>1</ID>
    <NAME type="Error" Line="1"/>
</EMPLOYEE>

<EMPLOYEE type="Error" Line="2"/>
 3
Author: bdoughan, 2012-09-16 19:34:59

Leggi questo link tutorial qui sotto menzionato per scoprire come si può convertire un file flat in xml, e per favore leggilo completamente, inoltre il motivo per fornirti questo tutorial è quello di renderti consapevole che non esiste un jumbo-mumbo magico per convertire file flat direttamente in xml, but yes there is a proper way to do it.....

Http://cafeconleche.org/books/xmljava/chapters/ch04.html

 1
Author: Kumar Vivek Mitra, 2012-09-16 12:22:57