Bonjour,
je cherche à valider un document XML qui pourrait ressembler à ça (en simplifiant) :
<root>
<network type="tcp">
<host>10.0.0.1</host>
<port>1234</port>
</network>
</root>
...
<root>
<network type="serial">
<device>/dev/ttyS0</device>
</network>
</root>
(la présence de <device/>
ou <host/>
dépend de l'attribut "type" de la balise parente)
malheureusement, je n'ai pas trouvé comment valider ça.
en XSD 1.0 je peux dire que la balise network peut avoir comme éléments host et device.
en XSD 1.1, j'aurais deux solutions : soit avec des assertions, soit avec des "conditional type assignment" (en gros on utilise des expressions XPath pour tester ce qu'on ne pouvait pas faire avant)
Malheureusement, je ne trouve pas de bibliothèque C ou C++ permettant de valider des schémas avec assertions ou types conditionnés.
D'où ma double question :
- est-ce possible de réaliser cette validation en XSD 1.0 ? (si oui, comment)
- sinon, existe-t-il des bibliothèques C/C++ permettant de le faire ?
merci
# La râche
Posté par Sygne (site web personnel) . Évalué à 3.
Au pire, il est toujours possible de passer le xml d'origine dans un filtre xslt pour transformer l'attribut
type
en balise, et de lancer la validation sur le document transformé. XSD 1.0 devrait alors pouvoir valider correctement ce document transformé.Ce n'est pas idéal, mais comme j'ai déjà pu constater qu'en dehors de java, les technologies xml sont un peu limitées sous linux, je suppose qu'il n'y a peut-être pas de solution idéale. Et s'il y en avait une, google la connaîtrait.
[^] # Re: La râche
Posté par cracky . Évalué à 1.
Bonjour,
Au "pire" il y a la commande en ligne xmllint c'est un must pour la validation Xml (et notamment son option --schema).
De plus xmllint est basé sur libxml2 (http://xmlsoft.org/), il y longtemps que je n'ai pas touché à C++, mais je chercherai de ce coté là …
En passant, pour ma part je trouve la syntaxe des schémas Relax NG (http://relaxng.org/) bien plus élégante que XSD.
Cordialement,
Cracky
[^] # Re: La râche
Posté par KAeL . Évalué à 1.
je préfère xmlstarlet (qui utilise aussi libxml2). Cependant, libxml2 ne gère pas les XSD 1.1
Il faudrait que je regarde si c'est possible en relaxng
[^] # Re: La râche
Posté par KAeL . Évalué à 1.
J'ai simplifié le cas pour l'illustration. Mais je pourrais avoir à tester plusieurs attributs, et là ça va commencer à être plus compliqué (quoique probablement possible). En tout cas cette solution parait réaliste !
L'alternative serait de vérifier le XML directement en c++ sans passer par un XSD, dans les cas où je ne peux pas facilement le faire. Malheureusement ça risque d'être pénible à faire :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.