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:
- id & salaire devrait être numberic
- la longueur du nom doit être inférieure à 20
- 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:
- Lire tous les enregistrements du fichier en utilisant BufferedReader et le tokeniser en utilisant StringTokenizer.
- Initialisez l'objet employé pour chaque enregistrement et ajoutez-les dans une collection (liste).
- Maintenir les erreurs (non-concordance des champs ou toute autre validation ayant échoué) dans Cartographie>.
- É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 ?
2 answers
Je ferais ce qui suit en utilisant les bibliothèques disponibles dans le JDK/JRE depuis Java SE 6.
- Créez un StAX (JSR-173)
XMLStreamWriter
pour afficher le contenu XML dans un fichier. - Utiliser le
XMLStreamWriter
pour écrire l'élément racine. - Lisez la ligne suivante de votre entrée
- Convertissez-le en
Employee
objet - Utilisez JAXB (JSR-222) pour rassembler l'objet sur le
XMLStreamWriter
- S'il y a une autre ligne, répétez l'étape 3.
- 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"/>
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.....