Document Object Model



Publié dans news:fr.comp.lang.java (2003-06-07):
Bonjour,

J'aimerais savoir s'il existe des projets open source qui permettent de créer a partir d'un XSD, un document XML valide en lui proposant les balises adaptées. (genre ce que fait XML Spy)
Il y a pollo et gendoc. Comme par hasard ce sont deux projets Français -:)) . Voir les URL ici:
http://jmvanel.free.fr/Principales_sources_technologiques.htm

gendoc je ne sais pas encore, mais pollo n'utilise pas toute l'information du XSD, en gros il prend l'info. de type DTD.
Mieux, sous vous aviez des astuces à me donner pour réaliser un tel produit je suis tout ouie. J'aimerais mettre en memoire ce XSD et l'utiliser efficacement. J'hesite a passer par des objets ou par un document xml qui permettrait d'exploiter ce XSD.
Il y a un endroit dans le document XML Schema où mettre des infos à destination d'un programme c'est la balise appinfo; par exemple pour y mettre un libellé de formulaire, le nom d'une classe qui va valider la saisie, ou bien des contraintes en XPath, etc ... On peut mettre des appinfo à tous les niveaux d'un document XML Schema.

Une autre piste que je peux donner, c'est ceci:

Document Object Model (DOM) Level 3 Validation Specification
Version 1.0
W3C Working Draft 05 February 2003
http://www.w3.org/TR/2003/WD-DOM-Level-3-Val-20030205/validation.html

Pour donner le parfum de cette spec., voici l'interface principale :
interface NodeEditVAL {

// CheckTypeVAL
const unsigned short WF_CHECK = 1;
const unsigned short NS_WF_CHECK = 2;
const unsigned short PARTIAL_VALIDITY_CHECK = 3;
const unsigned short STRICT_VALIDITY_CHECK = 4;

readonly attribute DOMString defaultValue;
readonly attribute DOMStringList enumeratedValues;
boolean canInsertBefore(in Node newChild,
in Node refChild);
boolean canRemoveChild(in Node oldChild);
boolean canReplaceChild(in Node newChild,
in Node oldChild);
boolean canAppendChild(in Node newChild);
boolean isNodeValid(in boolean deep,
in unsigned short wFValidityCheckLevel)
raises(ExceptionVAL);
};

Ce n'est encore qu'un document de travail, mais c'est exactement ce dont les éditeurs XML ont besoin. Il y a une valeur ajoutée par rapport à l'accès "brut" à l'élément du Schema correspondant au noeud courant (ce que fait la Post Schema Validation Information de Xerces). Il n'y a encore aucune implémentation, mais certainement Xerces (et les autres) vont s'y mettre quand ce sera une recommandation. En attendant, il est bon de s'y conformer, même si on en fait une implémentation très partielle et spécifique. Ainsi le moment venu, on pourra brancher  une implémentation conforme.
Ce que DOM3 ne précise pas c'est comment instancier ces interfaces. Si c'est comme PSVI avec Xerces, on transtypera (cast) un noeud ordinaire vers l'interface NodeEditVAL. Si on veut utiliser tout de suite ces interfaces, sans présager de la façon d'instancier, on peut par exemple faire une fabrique avec une méthode :
NodeEditVAL createNodeEditVAL(Node n);

Publié dans news:fr.comp.lang.java (2003-06-01):
QQun pourrait me dire mais en résumé ce qu'est le design pattern FACTORY et
le principe de fonctionnement ?
car je trouve que des trucs longs et complexes, et rien de simple qui parle
du principe.
Quand on utilise des interfaces, c'est à dire un comportement pur
sans implémentation précise, on a besoin de créer (instancier comme on dit) des objets qui implémentent cette interface. Et alors si on parsème son code de "new MaClasse();", on perd le bénéfice d'avoir du code indépendant de toute implémentation (et dépendant seulement de l'interface).

C'est là que le modèle de conception "Fabrique" intervient. On écrit une  classe "FabriqueDeMonInterface" (ou MonInterfaceFactory) avec une méthode creerMonInterface() (ou createMonInterface(), ou newInstance() ) sans argument qui renvoie un objet répondant à cette interface.
La création effective d'un objet MaClasse (ou autre qui répond à l'interface MonInterface) est ainsi centralisée dans la fabrique.
Pour changer d'implémentation, il suffit donc de changer un seul endroit: la méthode FabriqueDeMonInterface.creerMonInterface().

Et c'est pour avoir cette souplesse (et non pas pour enbêter le dévelopeur) que avec JAXP on fait typiquement 3 lignes au lieu d'une pour digérer un fichier XML:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse(URL);

Ainsi, si je veux pas l'implémentation par défaut de DOM, je n'ai qu'à faire préalablement ceci pour nommer l'implémentation:
System.setProperty(
"javax.xml.parsers.DocumentBuilderFactory",
"net.sf.saxon.om.DocumentBuilderFactoryImpl" );

Pareil pour serializer , en 2 mots ? moi je comprends ca commme quoi ca
"convertit" des informations d'un type dans un autr type.. c juste ?

Un serializer convertit un objet (par exemple un org.w3c.Document XML) en une chaîne de caractères ou un flot de sortie (OutputStream). En clair, à partir d'un XML en mémoire (ou résultant d'une série d'évènements SAX), le serializer crée le XML que nous voyons, avec ses balises. Il ne faut pas penser que soi même, vite fait sur le gaz, on va développer un serializer XML. Il ne suffit pas de faire:
out.println("<"+tag+">"+contenu);
parce que si la variable contenu contient un & , ou un <, ou un é alors que l'encodage est UTF-8, le XML ne sera pas bien formé.