2010-10-04 7 views
1

Voici la situation: J'ai un client qui m'a donné un schéma XML, et mon logiciel convertit leurs enregistrements de délimités par des tabulations en XML.Puis-je mettre à zéro un entier dans une classe générée par XSD?

L'un de ces champs, "file-sequence", est saisi en tant qu'entier dans le schéma. Cependant, le client du client (la cible d'intégration) veut que l'entier soit rempli à zéro et comporte 4 chiffres (EG, <file-sequence>0001</file-sequence>) dans le fichier XML de sortie réel.

Je suis sortie en utilisant la sérialisation, qui est agréable et automatique et indolore. Toutefois, étant donné que le champ est saisi en tant qu'entier dans le fichier XSD, le champ de séquence de fichiers est <file-sequence>1</file-sequence>. Ce qui a du sens. :)

Jusqu'à présent, je l'ai réduit les réponses potentielles à bas trois options:

  1. Modifier le schéma et changer le type de chaîne. Mettre à zéro le numéro de séquence lors de la mise à jour du champ. Inconvénient: Je dois me rappeler de le faire chaque fois que la cible d'intégration change le schéma (comme ils l'ont déjà une demi-douzaine de fois).

  2. Renoncez à utiliser la sérialisation XML en générant manuellement le code XML. Inconvénient: Beaucoup de travail, peut-être sujet aux erreurs, un sérieux code-odeur (pour moi).

  3. Sérialiser à un flux en mémoire, extraire le code XML brut de celui-ci, remplir l'entier. Inconvénients: Se sent vraiment sale, encore beaucoup de travail.

Existe-t-il d'autres options? Si non, quelle est l'option ici est la bonne façon de le faire? (Je pense que l'option 1 est probablement la plus propre.)

Répondre

2

Honnêtement, l'option 1 est la seule option réelle. Si la cible se soucie du nombre de caractères dans la chaîne, alors le champ n'est pas un entier; C'est une chaîne qui est limitée uniquement aux chiffres numériques.

+0

C'est ce que j'ai fini par faire. Sur le plan positif, puisque je génère la classe avec XSD, si j'oublie l'étape d'édition cruciale quand ils changeront le schéma, j'obtiendrai au moins une erreur de construction. –

0

Il y a des variations sur ce que je comprends que vous entendez par l'option 1 qui pourrait vous obtenir ce que vous cherchez. Ma première réaction est de définir le type de données d'intérêt à un contraint entier, en particulier, l'un le long des lignes de

xsd:integer {minLength = '4' maxLength = '4'} 

Si c'est peu satisfaisant, peut-être un regex

xsd:string {pattern = ...} 

aidera.