SELFHTML

Franz-Josef Herpers:
Espaces de nommage XML et validation

Page d'information: vue d'ensemble

vers le bas Franz-Josef Herpers
vers le bas Préambule
vers le bas La signification des espaces de nommage
vers le bas Problématique: espaces de nommage et validation
vers le bas Utilisation d'espaces de nommage dans les documents XML valides
vers le bas Espaces de nommage dans la DTD
vers le bas Perspective: schéma XML et espaces de nommage
vers le bas Liens

vers le bas 

Franz-Josef Herpers

E-Mail: Adresse électronique frajoherpers@hotmail.com

Il s'agit ici d'un article traduit de l'allemand par la rédaction de SELFHTML actuel. Veuillez poser vos questions relatives à cet article uniquement à son auteur, prenant compte que celui-ci ne maîtrise peut-être pas la langue française!

vers le hautvers le bas 

Préambule

Cet article traite des problèmes de validation des documents XML qui utilisent des Page en langue anglaise espaces de nommage XML. Connaissances préalables conseillées pour la compréhension: concept d' Page d'information: connexion exigée espaces de nommage XML. Le concept d'espace de nommage n'est pas abordé en détail ici.

vers le hautvers le bas 

La signification des espaces de nommage

Les espaces de nommage XML visent à éviter les conflits de noms et les ambivalences dans des documents XML contenant des éléments d'une ou de plusieurs définitions de type de document (DTD). En les rattachant à une Uniform Resource Identifier (URI) des noms potentiellement ambivalents sont reliés à un espace de nommage et sont ainsi qualifiés. Un espace de nommage n'est ni plus ni moins qu'une série de noms de types d'éléments et d'attributs pouvant être identifiés de façon univoque par le biais d'une URI. Les espaces de nommage utilisés dans un document doivent être déclarés dans le document XML. À cette fin, l'URI de l'espace de nommage est affectée à ce qu'on appelle un préfixe d'espace de nommage. Un élément ou attribut d'un espace de nommage est alors qualifié par le préfixe d'espace de nommage. Le préfixe d'espace de nommage fait alors office d'abréviation de l'URI.

Exemple: document XML liste_collaborateurs.xml

<?xml version="1.0" encoding="iso-8859-1"?>

<col:liste_collaborateurs
       xmlns:col="http://www.monserveur.fr/adresse"
       xmlns:edv="http://www.monserveur.fr/postes">
  <col:collaborateur>
    <col:nom>Jean-Marie Fontaine</col:nom>
    <col:adresse>
      <col:rue>13, rue de l'horloge</col:rue>
      <col:ville>13100 Aix-en-Provence</col:ville>
    </col:adresse>
    <edv:ordinateur>
      <edv:nom>Saturne</edv:nom>
      <edv:adresse>127.98.76.35</edv:adresse>
  </edv:ordinateur>
  </col:collaborateur>
  <col:collaborateur>
    <col:nom>Bernard Roux</col:nom>
    <col:adresse>
      <col:rue>188, Cours Mirabeau</col:rue>
      <col:ville>13100 Aix-en-Provence</col:ville>
    </col:adresse>
    <edv:ordinateur>
      <edv:nom>Morgane</edv:nom>
      <edv:adresse>156.97.234.98</edv:adresse>
    </edv:ordinateur>
  </col:collaborateur>
</col:liste_collaborateurs>

Explication:

Le document XML contient outre les noms et adresses des collaborateurs les données de l'ordinateur sur lequel chacun d'entre eux travaille. Pour éviter un conflit de noms concernnt les éléments <nom> et <adresse>, deux noms d'espace de nommage sont déclarés dans l'élément-racine. Le premier relie tous les noms d'éléments désignant les données des collaborateurs, le deuxième tous les noms d'éléments pour identifier l'ordinateur. En affectant les préfixes d'espace de nommage col et edv les noms d'éléments dans le document XML sont alors différenciés.

vers le hautvers le bas 

Problématique: espaces de nommage et validation

L'URI de l'espace de nommage ne doit pas forcément pointer sur une adresse existant réellement sur la toile, en particulier sur une DTD affectée à l'espace de nommage. La déclaration d'espace de nommage n'a pas la moindre fonction de lien et l'URI est en fin de compte un identificateur univoque formel pour l'espace de nommage. En déclarant l'espace de nommage, aucune liaison n'est établie entre un espace de nommage et les déclarations pour les éléments et les attributs de l'espace de nommage. Plus généralement: Le concept d'espace de nommage et le concept de validation de XML sont bien distincts.

Ce qui signifie concrètement qu'il faut veiller à certaines choses pour créer des documents XML valides utilisant des espaces de nommage.

vers le hautvers le bas 

Utilisation d'espaces de nommage dans les documents XML valides

Si vos documents XML utilisant les espaces de nommage doivent être valides, les types d'éléments et d'attributs affectés à un espace de nommage doivent être déclarés par un nom qualifié (c'eat à dire avec un préfixe d'espace de nommage). D'autre part, les attributs xmlns servant à désigner les déclarations d'espaces de nommage doivent être déclarés dans la DTD.

Exemple: Document XML non-valide

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE notice [
  <!ELEMENT notice (#PCDATA)>
  <!ATTLIST notice style CDATA #IMPLIED>
]>

<notice html:style="font-color:red" xmlns:html="http://www.w3.org/TR/REC-html40">
  Ce document n'est malheureusement pas valide!
</notice>

Exemple: Document XML valide

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE notice [
  <!ELEMENT notice (#PCDATA)>
  <!ATTLIST notice html:style CDATA #IMPLIED
                  xmlns:html CDATA #FIXED "http://www.w3.org/TR/REC-html40"
  >
]>

<notice html:style="font-color:red" xmlns:html="http://www.w3.org/TR/REC-html40">
  Ce document est valide!
</notice>

Explication:

À l'élément racine notice est affecté l'attribut style de l'espace de nommage html. L'attribut est qualifié grâce au préfixe html et l'espace de nommage est déclaré dans l'élément racine. Dans la DTD cet attribut est à déclarer avec préfixe: <!ATTLIST notice html:style CDATA #IMPLIED>. De plus l'attribut xmlns servant à la déclaration de l'espace de nommage doit aussi êre déclaré dans la DTD. Cela s'obtient en mentionnant un attribut en combinaison avec le mot-clé #FIXED. On s'assure ainsi que dans l'élément racine notice une déclaration d'espace de nommage interviendra toujours pour l'espace de nommage HTML même si elle n'est pas mentionnée explicitement. Malheureusement cela ne fonctionne pas avec tous les analyseurs syntaxiques (parser). En particulier l'analyseur syntaxique msxml intégré dans l'Explorer Internet signale alors une déclaration d'espace de nommage manquante. Pour être sûr de son fait, il faut aussi pour cette raison toujours déclarer l'espace de nommage dans l'élément racine.

Attention:

Dans des versioins plus anciennes de l'analyseur de syntaxe msxml de Microsoft (intégré dans l'Explorer Internet 5) l'utilisation de la mention d'attribut #FIXED pour la déclaration de l'attribut xmlns est indispensable, bien que le standard des espaces de nommage ne l'exige pas. La version actuelle (msxml3) n'impose plus cette restriction.

Exemple: liste_collaborateurs.xml avec DTD interne

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE col:liste_collaborateurs [
  <!ELEMENT col:liste_collaborateurs (col:collaborateur+)>
    <!ATTLIST col:liste_collaborateurs xmlns:col   CDATA #FIXED "http://www.monserveur.fr/adresse"
                                  xmlns:edv CDATA #FIXED "http://www.monserveur.fr/postes"
    >
  <!ELEMENT col:collaborateur (col:nom, col:adresse, edv:ordinateur)>
  <!ELEMENT col:adresse (col:rue, col:ville)>
  <!ELEMENT edv:ordinateur (edv:nom, edv:adresse)>
  <!ELEMENT col:nom (#PCDATA)>
  <!ELEMENT col:rue (#PCDATA)>
  <!ELEMENT col:ville (#PCDATA)>
  <!ELEMENT edv:nom (#PCDATA)>
  <!ELEMENT edv:adresse (#PCDATA)>
]>

<col:liste_collaborateurs
       xmlns:col="http://www.monserveur.fr/adresse"
       xmlns:rech="http://www.monserveur.fr/postes">
  <col:collaborateur>
    <col:nom>Jean-Marie Fontaine</col:nom>
    <col:adresse>
      <col:rue>13, rue de l'horloge</col:rue>
      <col:ville>13100 Aix-en-Provence</col:ville>
    </col:adresse>
    <edv:ordinateur>
      <edv:nom>Saturne</edv:nom>
      <edv:adresse>127.98.76.35</edv:adresse>
  </edv:ordinateur>
  </col:collaborateur>
  <col:collaborateur>
    <col:nom>Bernard Roux</col:nom>
    <col:adresse>
      <col:rue>188, Cours Mirabeau</col:rue>
      <col:ville>13100 Aix-en-Provence</col:ville>
    </col:adresse>
    <edv:ordinateur>
      <edv:nom>Morgane</edv:nom>
      <edv:adresse>156.97.234.98</edv:adresse>
    </edv:ordinateur>
  </col:collaborateur>
</col:liste_collaborateurs>

Attention:

La recommandation XML exige pour des documents valides que le nom de la DTD corresponde au nom de l'élément racine. Si le nom de l'élément racine est qualifié par un préfixe, le nom de la DTD doit alors aussi tenir compte de ce préfixe.

vers le hautvers le bas 

Espaces de nommage dans la DTD

Dans la DTD, les espaces de nommage ne sont pas reconnus en tant que tels. Pour un analyseur syntaxique XML, les préfixes d'espaces de nommage ne représentent pas l'URI de l'espace de nommage, mais ne sont somme toute qu'une partie du nom d'élément ou d'attribut. En d'autres termes: une DTD dans laquelle sont déclarés des types d'éléments de deux espaces de nommage, "ignore" qu'elle a affaire à deux espaces de nommage. L'exemple suivant explique pourquoi.

Exemple:

<?xml version="1.0"?>

<!DOCTYPE ns1:notice [
  <!ELEMENT ns1:notice (ns2:notice)>
    <!ATTLIST ns1:notice xmlns:ns1 CDATA #FIXED "http://www.monserveur.fr">
  <!ELEMENT ns2:notice EMPTY>
    <!ATTLIST ns2:notice xmlns:ns2 CDATA #FIXED "http://www.monserveur.fr">
]>

<ns1:notice xmlns:ns1="http://www.monserveur.fr">
  <ns2:notice xmlns:ns2="http://www.monserveur.fr"/>
</ns1:notice>

Explication:

Les deux types d'éléments déclarés dans la DTD possèdent le même nom local notice, se différencient pourtant par le préfixe (ns1 et ns2). Ils appartiennent malgré tout au même espace de nommage étant donné que le préfixe ne fait que représenter (en abrégé) l'URI de l'espace de nommage. Pour identifier les espaces de nommage, l'URI de l'espace de nommage est déterminante et elle est identique pour les deux éléments. Ceci ne s'applique cependant pas dans une DTD! Du point de vue de la DTD, deux types d'éléments différents sont déclarés (à savoir ns1:notice et ns2:notice). Ainsi ce document est valide. Si dans une DTD, une affectation de préfixe d'espaces de nommage à des URI d'espaces de nommage avait lieu, un analyseur syntaxique considérerait les deux noms d'éléments comme identiques et déclarerait le document comme non-valide étant donné qu'un type d'élément dans une DTD ne peut être déclaré qu'une seule fois.

vers le hautvers le bas 

Perspective: schéma XML et espaces de nommage

Un support direct des espaces de nommage est proposé par Page en langue anglaise XML-Schema, la langue-modèle adoptée par le W3C le 02 mai 2001 comme recommandation pour les documents XML. Un modèle XML ne définit pas seulement la structure d'un document XML mais peut aussi compléter des espaces de nommage. Vous pouvez ainsi dans un modèle XML - à la différence de la DTD - relier les types d'éléments et d'attributs déclarés à un espace de nommage (qu'on appelle espace de nommage cible). Les éléments et les attributs de l'espace de nommage peuvent alors être utilisés dans le document XML avec un préfixe. En plus de la déclaration d'espace de nommage, le document XML contient alors une mention (URL) pour l'analyseur syntaxique où le document modèle qui définit les types d'éléments et d'attributs peut être trouvé. Les analyseurs syntaxiques de validation peuvent ainsi charger le modèle XML pour s'assurer de la validité du document XML

vers le hautvers le bas 

Liens

Espaces de nommage en XML
Traduction de la recommandation du W3C sur les espaces de nommage XML

Page en langue anglaise Espaces de nommage en XML (Original)
Recommandation du consortium du World Wide Web (W3C) pour les espaces de nommage XML

Page en langue anglaise Questions récurrentes sur les espaces de nommage XML par Ronald Bourret
Très vaste et détaillé!

Page en langue anglaise Schéma XML
La page de schéma XML du W3C

vers le haut

© 2005 Seite Informations