2009-05-27 9 views
6

Salut J'essaie de comprendre les XSD, XML et les espaces de noms, mais je n'arrive pas à faire fonctionner les choses comme je le veux.XSD avec les imports et les espaces de noms

J'ai un XSD qui, en ce moment, commence comme ceci:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.example.com"> 
    <xs:import namespace="http://www.example.com" schemaLocation="Include.xsd" /> 

Comme vous pouvez le voir, elle importe un autre fichier XSD, qui commence comme ceci:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" 
      targetNamespace="http://www.example.com" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.example.com"> 

Je avoir des documents XML basés sur ce schéma:

<foobar> 
    <whatever>.... 

en fait, je ne me soucie pas de ce que les espaces de noms, je ju st veulent que la chose sacrément fonctionne. Auparavant, je n'utilisais aucun espace de noms mais il semble que je doive les utiliser pour importer un XSD dans un autre. Ce que je ne veux pas faire, c'est devoir fournir des préfixes à tous les éléments de mes documents xml.

Pour ce faire, quelle combinaison de valeurs ai-je besoin pour les différents attributs (targetNamespace, namespace, xmlns, elementFormDefault etc.) dans les documents XSD et XML?

Actuellement, tous les éléments définis dans le document XSD importé requièrent une qualification d'espace de nommage dans le fichier XML.

+0

Est-ce que votre document commence en fait avec meaninging vous avez un élément « xml » défini dans l'un des schémas, ou voulez-vous dire le document commence par ? – Jherico

+0

Je voulais dire que la racine était xml - je l'ai réparé pour éviter toute confusion. – cbp

Répondre

13

Si vous n'utilisez pas vos schémas ou namespaces partager les mêmes espaces de noms, vous seriez beaucoup mieux en utilisant xs: inclure plutôt que xs: import. Le schéma A peut inclure le schéma B si B a le même espace de noms que A ou s'il n'a pas d'espace de nom déclaré (si ce dernier cas est le cas, B 'adopte' l'espace de noms de l'englobeur). Alors ... quelque chose comme:

<xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" 
      xmlns:xs="http://www.w3.org/2001/XMLSchema" 
      xmlns="http://www.example.com"> 
    <xs:include schemaLocation="Include.xsd" /> 

<!-- ... --> 

</xs:schema> 
+0

ahhh à droite! Merci – cbp

1

Je pense que vous devez définir votre elementFormDefault sur "non qualifié" si vous voulez éviter les préfixes sur vos éléments XML. Le reste devrait être bon, je pense - l'espace de noms est le même entre votre maître et votre XSD importé - c'est bien. Vous spécifiez le xmlns = sans préfixe - c'est bien. Tu devrais être bon à faire.

Marc

+0

Merci, vous avez raison - j'étais plus proche que je ne le pensais. Cependant, je constate que lorsque je crée mon document XML, les éléments qui sont définis dans le XSD importé exigent que l'espace de nommage soit spécifié (même si le fichier XSD importé et le fichier XSD réel ont tous deux la valeur 'non qualifié'). – cbp

Questions connexes