xmllint : valider un fichier XML à l'encontre de deux schémas XSD (enveloppe / charge utile)
Je suis en utilisant xmllint à faire certaines validations et j'ai une instance de document XML qui doit valider à l'encontre de deux schémas: l'un pour l'extérieur "enveloppe" (qui comprend un tout élément) et un pour la charge en question. Dire A. xsd est l'enveloppe de schéma, B. xsd une charge utile de schéma (il existe différents types de charges utiles) et ab.xml valide instance de document XML (je vous donner un exemple, à la fin du post).
J'ai tous les trois fichiers disponibles localement dans le même répertoire et je suis en utilisant xmllint pour effectuer la validation, en fournissant comme le schéma argument de l'emplacement de l'extérieur (enveloppe) schéma:
xmllint -schema A.xsd ab.xml
... pourtant, bien que je fournir à la fois de l'A. xsd et B. xsd dans le document d'instance (à l'aide de la xsi:schemaLocation élément) xmllint ne parvient pas à le trouver et se plaint:
ab.xml:8: element person: Schemas validity error : Element '{http://www.example.org/B}person': No matching global element declaration available, but demanded by the strict wildcard.
ab.xml fails to validate
Donc, apparemment, xmllint n'est pas la lecture de la xsi:schemaLocation élément. Je comprends que xmllint peut être configuré avec des catalogues, mais je n'ai pas réussi à obtenir xmllint de trouver à la fois des schémas. Comment pourrais-je obtenir xmllint à prendre en compte à la fois des schémas lors de la validation du document d'instance ou est-il un autre utilitaire de ligne de commande ou graphique de l'outil que je pourrais utiliser à la place?
SSCCE
A. xsd - enveloppe schéma
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:a ="http://www.example.org/A"
targetNamespace ="http://www.example.org/A">
<element name="someType" type="a:SomeType"></element>
<complexType name="SomeType">
<sequence>
<any namespace="##other" processContents="strict"/>
</sequence>
</complexType>
</schema>
B. xsd - charge utile schéma
<?xml version="1.0" encoding="UTF-8"?>
<schema elementFormDefault="qualified"
xmlns ="http://www.w3.org/2001/XMLSchema"
xmlns:b ="http://www.example.org/B"
targetNamespace="http://www.example.org/B"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<element name="person" type="b:PersonType"></element>
<complexType name="PersonType">
<sequence>
<element name="firstName" type="string"/>
<element name="lastName" type="string"/>
</sequence>
</complexType>
</schema>
ab.xml - document d'instance
<?xml version="1.0" encoding="UTF-8"?>
<a:someType xmlns:a="http://www.example.org/A"
xmlns:b="http://www.example.org/B"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/A A.xsd
http://www.example.org/B B.xsd">
<b:person>
<b:firstName>Mary</b:firstName>
<b:lastName>Bones</b:lastName>
</b:person>
</a:someType>
Vous devez vous connecter pour publier un commentaire.
J'ai quitté sur xmllint et utilisé Xerces à la place.
J'ai téléchargé Xerces tarball et après l'explosion à certains locaux dossier que j'ai créé à la suite de valider script basé sur cette suggestion (à partir de l'archive web - lien original étant maintenant mort):
La ab.xml fichier est ensuite validée, contre les deux schémas, avec la commande suivante:
Xerces est la lecture du schéma des emplacements de l' xsi:schemaLocation élément ab.xml ils n'ont pas besoin d'être en ligne de commande invocation.
<b:firstName>Mary</b:firstName>
à<b:firstName3>Mary</b:firstName3>
, le XML est encore bien formé, mais pas plus XSD valides. Le script dûment taches:[Error] ab.xml:9:23: cvc-complex-type.2.4.a: Invalid content was found starting with element 'b:firstName3'. One of '{"http://www.example.org/B":firstName}' is expected.
Vous pouvez créer un wrapper de schéma et d'importer les deux espaces.
AB.xsd:
Alors:
Si vous avez eu une
import
élément dans votreA.xsd
, juste après l'ouverture de laschema
tag,ensuite, vous pouvez passer
A.xsd
àxmllint
et qu'il allait travailler avec: