Comparaison/Test de "structure" XML

Comparaison/Test de "structure" XML - XML/XSL - Programmation

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

Reply

Marsh Posté le 19-10-2010 à 19:50:39   

Reply

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...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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

Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-10-2010 à 07:03:58    

lalalallal a écrit :

Bonsoir,
 
Merci beaucoup pour la réponse mais j'ai finalement trouvé comment le faire ^^
 
Lalalallal


Et tu fais comment ?


---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 28-10-2010 à 09:31:53    

masklinn a écrit :


XSD = caca.
RNG = mieux.


 
Je connais pas RNG. Tu parles de ça ?  http://fr.wikipedia.org/wiki/RNG   :D


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-10-2010 à 09:55:12    

rufo a écrit :


 
Je connais pas RNG. Tu parles de ça ?  http://fr.wikipedia.org/wiki/RNG   :D


http://en.wikipedia.org/wiki/RelaxNG


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

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)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

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... :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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 {
    ( attribute id { text }
    | element id { text })
}


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)

Message cité 1 fois
Message édité par masklinn le 28-10-2010 à 12:58:07

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-10-2010 à 12:55:21   

Reply

Marsh Posté le 28-10-2010 à 13:57:08    

masklinn a écrit :


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 {
    ( attribute id { text }
    | element id { text })
}


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)


 
Je suis pas sûr d'avoir bien compris le sens de cette phrase. Tu peux développer, svp?

Message cité 1 fois
Message édité par rufo le 28-10-2010 à 13:57:16

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-10-2010 à 14:36:18    

À oué j'avais pas pensé au cas d'un spoof :ouch:
Pas mal ... je garde ce RNG dans un coin de ma tête pour la prochaine fois !


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 28-10-2010 à 15:02:27    

esox_ch a écrit :

À oué j'avais pas pensé au cas d'un spoof :ouch:


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 :D


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-10-2010 à 15:07:51    

C'est déjà nettement moins pire que le DTD à mon sens  [:spamafote]


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

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  [:spamafote]


Chuis pas d'accord. DTD est moins puissant mais beaucoup plus simple à lire.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-10-2010 à 15:24:47    

masklinn a écrit :


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.


 
Merci pour ces précisions :jap: 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 :o Par contre, c'est vrai que c'était assez facile à lire. XSD est plus verbeux... Personne n'est parfait :lol:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

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 :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

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 :o


C'est un avantage ça, pas un inconvénient.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed