OVH Cloud OVH Cloud

xml schema validation et pb de pile

4 réponses
Avatar
Gabriel
bonsoir,

je suis en train de chercher à valider un document xml par rapport à un
schéma. Le dit schéma pèse 100Ko.
Le document pèse 3ko.

J'utilise sax puisque je n'ai pas besoin de manipuler le DOM. Le pb est
que à tous les coups, le programme plante :
Exception : java.lang.OutOfMemoryException Java heap space.

J'ai essayé de passer -xm512m et pareil, sauf que c'est plus long à
venir ; forcément :).

Ma question est la suivante : qu'utilisez-vous pour valider du xml avec
un schéma un tant soit peu complexe ?

Je cherche surtout des tutoriaux m'expliquant comment utiliser xerces à
la place du parseur intégré au jdk1.5, des liens qui portent sur ce
problème (Google ne m'a pour l'instant rien donné :() bref, surtout des
ressources à lire !

Merci bcp pour votre temps.

Bonne soirée !

4 réponses

Avatar
Aurel
Personnellement, j'utilise JDOM pour le XML... mais je ne sais pas si ça
permet de valider un XML à partir d'un XSD... je te laisse voir... :
http://www.jdom.org/

Sinon, si ça peut t'aider, voici un code récupérer sur le site de Sun, mais
qui ne fonctionne apparemment qu'avec la JRE 1.5...
Je n'ai rien testé, donc je te laisse voir :-)

try {
//parse an XML document into a DOM tree
DocumentBuilder parser =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File("instance.xml"));

// create a SchemaFactory capable of understanding WXS schemas
SchemaFactory factory =
SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

// load a WXS schema, represented by a Schema instance
Source schemaFile = new StreamSource(new File("mySchema.xsd"));
Schema schema = factory.newSchema(schemaFile);

// create a Validator instance, which can be used to validate an
instance document
Validator validator = schema.newValidator();

// validate the DOM tree
validator.validate(new DOMSource(document));
} catch (ParserConfigurationException e1) {
e1.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}



"Gabriel" a écrit dans le message de news:
41dc6ef7$0$7746$
bonsoir,

je suis en train de chercher à valider un document xml par rapport à un
schéma. Le dit schéma pèse 100Ko.
Le document pèse 3ko.

J'utilise sax puisque je n'ai pas besoin de manipuler le DOM. Le pb est
que à tous les coups, le programme plante :
Exception : java.lang.OutOfMemoryException Java heap space.

J'ai essayé de passer -xm512m et pareil, sauf que c'est plus long à venir
; forcément :).

Ma question est la suivante : qu'utilisez-vous pour valider du xml avec un
schéma un tant soit peu complexe ?

Je cherche surtout des tutoriaux m'expliquant comment utiliser xerces à la
place du parseur intégré au jdk1.5, des liens qui portent sur ce problème
(Google ne m'a pour l'instant rien donné :() bref, surtout des ressources
à lire !

Merci bcp pour votre temps.

Bonne soirée !


Avatar
kanari666
[SOLVED]
bonjour et merci pour ta réponse.
Le bp était en fait que j'avais dans mon schéma un nbre do'occurences
d'un élément égal à 10000 et xerces aimait pas : il fallait mettre
"unbounded", ce qui ne m'arrange pas du tout.
Comme je ne peux pas modifier le schéma, je vais changer le schéma à
la volée puis le restaurer à l'issue du traitement :)
Cette "issue" était sur le site de xerces après bcp de lecture et de
tests :)
Je n'ai pas testé ta solution mais je vais le faire, sait-on jamais
(mon code était sensiblement identique, sauf que je n'utilisais pas le
validator instance)....

Bonne soirée !
Avatar
Aurel
Salut,

peux tu me donner ou expliquer ta solution s'il te plaît ?

Merci d'avance :)

aurel


a écrit dans le message de news:

[SOLVED]
bonjour et merci pour ta réponse.
Le bp était en fait que j'avais dans mon schéma un nbre do'occurences
d'un élément égal à 10000 et xerces aimait pas : il fallait mettre
"unbounded", ce qui ne m'arrange pas du tout.
Comme je ne peux pas modifier le schéma, je vais changer le schéma à
la volée puis le restaurer à l'issue du traitement :)
Cette "issue" était sur le site de xerces après bcp de lecture et de
tests :)
Je n'ai pas testé ta solution mais je vais le faire, sait-on jamais
(mon code était sensiblement identique, sauf que je n'utilisais pas le
validator instance)....

Bonne soirée !
Avatar
Gabriel
Aurel wrote:
Salut,

peux tu me donner ou expliquer ta solution s'il te plaît ?

Merci d'avance :)

aurel

OK, elle est pas encore implémentée donc pas de code ;)

Mais voila l'idée :

Chargement du schéma xsd en mémoire avec un sax reader (plus léger que
dom), à chaque évènement, je renvoie dans le flux de sortie le même
élément sauf si c'est c'est l'élément que je souhaite modifier, auquel
cas, je remplace l'attribut nbOccurences="10000" par unbounded.

Le flux de sortie étant donc une version modifiée du fichier xsd.
A chaque fois que le schéma changera, je lancerai cette "moulinette"
pour avoir le schéma à jour.

A moins que je charge tout en JDOM, je modifie les éléments que je sais
devoir modifier et j'écris ( à la réflexion, la charge en mémoire est
plus lourde mais bon, je lance pas cette moulinette tous les jours) et
c'est moins embêtant à écrire qu'avec un SAXReader....

Voilà.....