Comparaison/Test de "structure" XML - XML/XSL - Programmation
Marsh Posté le 20-10-2010 à 10:22:24
Tu devrais peut-être regarder du côté de XSD. Ca pourrait répondre à ton besoin...
Marsh Posté le 27-10-2010 à 19:12:00
Bonsoir,
Merci beaucoup pour la réponse mais j'ai finalement trouvé comment le faire ^^
Lalalallal
Marsh Posté le 27-10-2010 à 19:59:48
rufo a écrit : Tu devrais peut-être regarder du côté de XSD. Ca pourrait répondre à ton besoin... |
XSD = caca.
RNG = mieux.
Marsh Posté le 28-10-2010 à 07:03:58
lalalallal a écrit : Bonsoir, |
Et tu fais comment ?
Marsh Posté le 28-10-2010 à 09:31:53
masklinn a écrit : |
Je connais pas RNG. Tu parles de ça ? http://fr.wikipedia.org/wiki/RNG
Marsh Posté le 28-10-2010 à 09:55:12
rufo a écrit : |
http://en.wikipedia.org/wiki/RelaxNG
Marsh Posté le 28-10-2010 à 10:50:10
Et niveau compatibilité avec les différents parsers ça donne quoi? Parce que c'est la première fois que j'en entends parler de ce RNG (par contre c'est vrai que la syntaxe à l'air vraiment cool)
Marsh Posté le 28-10-2010 à 12:24:57
Effectivement, c'est moins verbeux. Par contre, côté parsers, ça risque d'être galère...
Marsh Posté le 28-10-2010 à 12:55:21
esox_ch a écrit : Et niveau compatibilité avec les différents parsers ça donne quoi? Parce que c'est la première fois que j'en entends parler de ce RNG (par contre c'est vrai que la syntaxe à l'air vraiment cool) |
http://www.relaxng.org/#validators
Perso j'utilise lxml (en Python), qui est une surcouche à libxml2, et comprend donc très bien le rng (pas le rnc par contre, donc faut traduire le source entre l'écriture et l'utilisation du schéma).
Il y a aussi nxml-mode pour emacs qui peut valider un fichier XML contre un schéma rnc (pas rng ce coup ci), et <oXygen> qui n'a il me semble pas de problème à comprendre (et valider contre) rng comme rnc.
Et la syntaxe est pas le seul truc que je trouve supérieur à XSD, je préfère aussi la sémantique: rng c'est du pattern matching, donc tu peux exprimer une contrainte genre "un élément 'a' contenant un attribut 'id' OU un élément 'id'" trivialement:
element a { |
et rng ne fait pas d'augmentation de l'infoset (un document est strictement le même qu'il ait été validé contre un rng ou pas, c'est pas le cas avec un XSD)
Marsh Posté le 28-10-2010 à 13:57:08
masklinn a écrit :
|
Je suis pas sûr d'avoir bien compris le sens de cette phrase. Tu peux développer, svp?
Marsh Posté le 28-10-2010 à 14:27:47
rufo a écrit : Je suis pas sûr d'avoir bien compris le sens de cette phrase. Tu peux développer, svp? |
Bien sûr.
Un infoset XML, c'est l'ensemble des informations contenues dans un document XML (nb: tu peux aussi créer un infoset programatiquement sans avoir de document physique derrière) bien formé et correctement namespacé (ordre des nodes, contenu textuel, valeur des attributs, ...). D'après la spec w3c sur les infosets, un document a un infoset même s'il n'est pas validé par un schéma:
Citation : There is no requirement for an XML document to be valid in order to have an information set. |
XSD a hérité de DTD deux fonctionnalités — @fixed et @default — qui permettent de définir dans le schéma des valeurs pour des éléments ou attributs d'un document XML si celles-ci sont absentes. C'est pratique parce que ça permet, justement, de définir des valeurs par défaut.
Sauf que derrière selon que le parseur utilisé est validant ou pas, et selon que tu aies validé ou non ton document, tu n'auras pas les mêmes données. Sans compter que les valeurs injectées dépendent d'un schéma distant lié par une URL arbitraire, qui peut être modifié ou spoofé sans contrôle par la personne consommant le document. Ça diminue donc très fortement la portabilité, la flexibilité et la sécurité du document.
Parce que RNG n'augmente pas l'infoset, soit les données sont intégralement présentes dans le document soit cette connaissance des valeurs par défaut et autres est dans le code applicatif. Dans tous les cas, que le document ait été validé ou pas il aura strictement le même contenu.
Et perso je préfère ça.
Marsh Posté le 28-10-2010 à 14:36:18
À oué j'avais pas pensé au cas d'un spoof
Pas mal ... je garde ce RNG dans un coin de ma tête pour la prochaine fois !
Marsh Posté le 28-10-2010 à 15:02:27
esox_ch a écrit : À oué j'avais pas pensé au cas d'un spoof |
En toute honnêteté, c'est loin d'être le plus gros risque du monde, la non portabilité due à la différence entre l'infoset validé et l'infoset non validé me gène plus perso.
Et le fait que les XSD soit totalement illisibles
Marsh Posté le 28-10-2010 à 15:07:51
C'est déjà nettement moins pire que le DTD à mon sens
Marsh Posté le 28-10-2010 à 15:09:51
esox_ch a écrit : C'est déjà nettement moins pire que le DTD à mon sens |
Chuis pas d'accord. DTD est moins puissant mais beaucoup plus simple à lire.
Marsh Posté le 28-10-2010 à 15:24:47
masklinn a écrit :
|
Merci pour ces précisions Effectivement, le fait que suivant le parser et que les données aient été validés ou pas, le doc XML soit différent est gênant
Pour la DTD, son principal pb était que c'était pas un doc xml Par contre, c'est vrai que c'était assez facile à lire. XSD est plus verbeux... Personne n'est parfait
Marsh Posté le 28-10-2010 à 15:41:31
D'accord mais l'important c'est quand même le rapport puissance/complexité selon moi.
Du coup en DTD, c'est vrai que c'est un peu plus simple à lire que le XSD, mais t'es quand même vite limité.. Du coup je préfère encore utiliser un XSD qu'un DTD..
Par contre là ton RNG il me plait bien
Marsh Posté le 28-10-2010 à 16:02:51
rufo a écrit : Pour la DTD, son principal pb était que c'était pas un doc xml |
C'est un avantage ça, pas un inconvénient.
Marsh Posté le 19-10-2010 à 19:50:39
Bonjour,
je me permet de vous contacter car je suis face au problème suivant
j'ai un XML du type
<Jouets>
<Lego>
<nom>Voiture</nom>
<prix>12</prix>
<modele>
<couleur>rouge</couleur>
<ref>A123RED</ref>
</modele>
<modele>
<couleur>bleu</couleur>
<ref>A123BLUE</ref>
</modele>
</Lego>
....
<Lego>
<nom>Train</nom>
<prix>13</prix>
<modele>
<couleur>rouge</couleur>
<ref>A142RED</ref>
</modele>
</Lego>
</Jouets>
et j'aimerai créer un script XSL qui compare cet arbre à un autre arbre théorique dont la structure est connue d'avance (contenu dans le XSL)
Par exemple pour la voiture si l'on devait avoir :
<Lego>
<nom>Voiture</nom>
<modele>
<couleur>rouge</couleur>
<ref>A123RED</ref>
</modele>
<modele>
<couleur>vert</couleur>
<ref>A123GRE</ref>
</modele>
</Lego>
Le programme devra tester chacun des jouets du XML et détecter qu'il manque la couleur verte et que la couleur bleue est en trop.
Pour le train il ne fera rien car train <> voiture.
Bien entendu, il peut y avoir 1 voiture comme 300 dans le XML avec des prix différents.
Si quelqu'un pouvais m'aider ou au moins me donner des pistes de réflexions afin de résoudre ce problème ce serai vraiment cool.
Bonne soirée,
Lalalallal