convertir des enregistrements de fichiers plats en xml en java


J'ai un scénario où les enregistrements des employés sont écrits dans un fichier plat, quelque chose comme:

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

Maintenant, je veux lire ce fichier plat et convertir les enregistrements des employés ci-dessus en un nouveau fichier xml à chaque fois, donc à la fin, je devrais avoir le fichier xml avec les données suivantes:

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

Maintenant, pour implémenter ce concept, je dois prendre soin des validations des données comme:

  1. id & salaire devrait être numberic
  2. la longueur du nom doit être inférieure à 20
  3. une seule ligne d'un fichier plat doit contenir plus de 4 champs

Si l'une des validations échoue, elle doit être reflétée dans le fichier XML avec le numéro de ligne d'erreur, quelque chose comme:

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

Ou

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

Maintenant, les applications doivent être conçues de telle sorte que les composants soient enfichables avec des alternatives. Pour exemple, Il devrait être possible de remplacer l'analyseur utilisé pour analyser un fichier d'entrée sur la base du séparateur avec un autre qui analyse il comme longueur fixe.

Donc, d'une manière ou d'une autre, je devrai concevoir le concept en couches comme

Parsing -> Validation -> Output Generation.

Maintenant, afin de mettre en œuvre ce concept, j'ai donné une pensée, qui est la suivante:

  1. Lire tous les enregistrements du fichier en utilisant BufferedReader et le tokeniser en utilisant StringTokenizer.
  2. Initialisez l'objet employé pour chaque enregistrement et ajoutez-les dans une collection (liste).
  3. Maintenir les erreurs (non-concordance des champs ou toute autre validation ayant échoué) dans Cartographie>.
  4. Écrire ou Marshal la liste en xml en utilisant une API XML Builder (pas clair qui serait le meilleur).

Quelqu'un peut-il me donner la meilleure suggestion ou des conseils pour réaliser la mise en œuvre ?

Author: kleopatra, 2012-09-16

2 answers

Je ferais ce qui suit en utilisant les bibliothèques disponibles dans le JDK/JRE depuis Java SE 6.

  1. Créez un StAX (JSR-173) XMLStreamWriter pour afficher le contenu XML dans un fichier.
  2. Utiliser le XMLStreamWriter pour écrire l'élément racine.
  3. Lisez la ligne suivante de votre entrée
  4. Convertissez-le en Employee objet
  5. Utilisez JAXB (JSR-222) pour rassembler l'objet sur le XMLStreamWriter
  6. S'il y a une autre ligne, répétez l'étape 3.
  7. Utilisez le XMLStreamWriter pour terminer le document.

Mise à JOUR

Il existe différentes options pour effectuer la validation réelle, ci-dessous je vais montrer comment représenter les informations résultantes dans un modèle d'objet qu'une implémentation JAXB pourrait utiliser pour produire le résultat souhaité.

Employé

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

}

Valeur

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

}

Sortie

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

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

Lisez ce lien de tutoriel mentionné ci-dessous pour savoir comment convertir un fichier plat en xml,{[3] } et veuillez le lire complètement, de plus, la raison de vous fournir ce tutoriel est de vous faire prendre conscience qu'il n'y a pas de jumbo - mumbo magique pour convertir un fichier plat directement en 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