web-dev-qa-db-fra.com

Comment liez-vous XML à un XSD?

Je me demandais, tout comme nous utilisons la déclaration pour lier XML à une DTD, comment le faisons-nous avec XSD?

Exemple MSDN:

<?xml version="1.0"?>
<Product ProductID="123" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="Product.xsd">
    <ProductName>Rugby jersey</ProductName>
</Product> 

est-ce le xsi: NoNamespaceSchemaLocation qui fait l'affaire? Ou est-ce juste un autre espace de noms?

[EDIT] Et est le

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

..line juste pour nous donner un espace de noms XML unique, ou fournit-il également des informations sur l'emplacement du schéma?

21
cwap

Essayez schemaLocation .

<?xml version="1.0"?>

<note
xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.w3schools.com note.xsd">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

noNamespaceSchemaLocation est différent. Notez que les deux ne sont en effet que des "astuces" en théorie, pour un consommateur d'un document XML. Je n'ai jamais rencontré de processeur xml qui ne les a pas suivis; après tout, c'est une recommandation du W3C. voir http://www.w3.org/TR/xmlschema-1/

Mais en effet, cela pourrait se tromper, comme ici , mais là encore, il est considéré comme un bug pour une raison.

Pour faire court: je lui fais confiance, sans aucun mal jusqu'à présent :-)

Je ne pense pas qu'un processeur xml à moitié décent puisse ignorer cette "astuce" de nos jours.

Les URL sont toujours à caractère unique, mais dans certains cas, certaines informations seront fournies sous l'URL.

19
Peter

xsi: noNamespaceSchemaLocation et xsi: schemaLocation fournissent tous deux des conseils aux processeurs XML qui décident de respecter ces conseils. Mais ce ne sont que des indices. Ils n'entraînent pas nécessairement la validation de votre document par rapport au schéma.

4
John Saunders

En général, j'inclus simplement l'espace de noms et je m'attends à ce que si celui qui le traite se soucie de le valider, il obtiendra le schéma et configurera son environnement de traitement afin qu'il puisse trouver le XSD. J'ai eu un succès limité avec xsi:schemaLocation et ces attributs. La plupart des problèmes sont généralement centrés sur la recherche du fichier XSD lui-même. Certains processeurs souhaitent que le chemin d'accès soit inclus, ce qui est très amusant si le XSD est sur un système de fichiers au lieu d'un serveur Web.

Chaque processeur semble implémenter la recherche un peu différemment. Certains utilisent des objets de catalogue de schémas distincts, d'autres nécessitent que vous chargiez et attachiez des schémas séparément. À moins que vous ne fournissiez le code pour traiter les documents, il est préférable de ne pas inclure xsi:schemaLocation ou xsi:noNamespaceSchemaLocation A MON HUMBLE AVIS. La seule chose que leur inclusion peut faire est d'empêcher quiconque traite votre document de placer le schéma au même emplacement ou de trouver un moyen de faire ignorer le processeur choisi ou de contourner la spécification d'emplacement.

En remarque, le plus gros problème que j'ai rencontré était en fait avec les DTD qui ont été spécifiées à l'aide d'une déclaration SYSTEM qui faisait référence à "c:\somepath\doc.dtd". Le problème était que je traitais les documents sur une boîte FreeBSD. J'ai fini par écrire mon propre résolveur pour mapper les chemins de style Windows vers un système de fichiers local car je ne pouvais pas modifier les documents eux-mêmes et je devais les valider.

3
D.Shawley

Ce n'est pas une question stupide, mais John Saunders a raison .

tout comme nous utilisons la -decleration pour lier XML à une DTD, comment le faisons-nous avec XSD?

Voici l'essence du problème - vous ne pouvez pas. L'un des problèmes de l'approche DTD était que le document spécifiait le mécanisme de validation et non le consommateur du document. Après la DTD, vous pouvez prendre un document XML et le valider avec XSD ou RELAX NG ou un autre mécanisme - ils sont découplés (en théorie au moins). Tout lien XSD n'est qu'un indice et est facultatif. Il n'est pas possible de valider un document arbitraire .

3
McDowell