En-tête de schéma XML & amp; Configuration de l'espace de noms
La migration à partir de DTD, XSD et pour une raison que la transition est un semés d'embûches. Je comprends comment définir le schéma une fois que je suis à l'intérieur de la <xs:schema>
balise racine, mais d'avoir passé l'en-tête & déclaration d'espace de noms choses se révèle être particulièrement déroutant pour moi.
J'ai essayé de suivre le bien agencées tutoriel sur la W3S mais même le tutoriel semble supposer beaucoup de connaissances à l'avant.
Je crois que je suis à la recherche d'un Roi anglais explication des attributs qui fait quoi, où ils vont et pourquoi:
- xmlns
- xmlns:xs
- xmlns:xsi
- targetNamespace
- xsi:schemaLocation
Et, dans certains cas, je vois différentes variations de ces éléments/attributs, tels que xsi
qui semble avoir deux notations différentes, comme xsi:schemaLocation="..."
et xs:import schemaLocation="..."
.
Je suppose entre tous ces légères variations je n'arrive pas à faire des têtes ou queues de ce que chacun de ces ne. Merci d'avance pour apporter toute la clarté à cette confusion!
source d'informationauteur IAmYourFaja
Vous devez vous connecter pour publier un commentaire.
La première chose que vous aurez besoin de comprendre sont des espaces de noms XML. Si vous avez peu de temps à perdre, vous avez pu lire la spécification. J'ai trouvé ceci pour être une des plus claires spécifications liées à XML. Ce n'est pas grave si vous ne comprenez pas tout ce qu'il dit, c'est une bonne base. Mais voici un résumé rapide.
Éléments et attributs XML ont un nom. Quand vous voyez
<test att="hello"/>
vous êtes à la recherche à un élément avec le nom "test", dans lequel nous avons un attribut avec le nom "att". Mais ce n'est pas vraiment toute l'histoire...XML est une syntaxe qui permet de mélanger le contenu à partir de différents langages de balisage. Par exemple, lors de l'utilisation de XSLT pour transformer un document XML dans une page XHTML, vous avez affaire à au moins trois langages de balisage défini en XML: votre document d'entrée, XSLT et XHTML. De tels mélanges deviendrait plutôt dur si chacun a réservé sa propre élément/attribut noms et pas de collisions étaient jamais permis.
Entrer dans des espaces de noms XML. Un espace de noms XML définit une "sphère" au sein de laquelle les noms d'élément et attribut avons réelle de la sémantique. L'élément "modèle" a une signification bien définie dans l'espace de noms XSLT. L'élément "complexType" a une signification bien définie dans l'espace de noms XML Schema. Si vous souhaitez utiliser dans votre propre langage de balisage XML, alors que c'est possible, à condition de le faire dans un autre espace de noms.
Afin de s'assurer d'un espace de noms est unique, vous aurez besoin de fournir certains identificateur unique. La spécification réglé sur l'utilisation d'Uri, le plus souvent sous la forme d'une URL HTTP. La raison en est simple: ces Url ont tendance à être de bons identifiants uniques. Mais c'est aussi une cause très fréquente de confusion parce que les gens pensent que l'Url a vraiment de sens ou d'accéder via le réseau au cours de traitement XML. Sais très bien que ce n'est pas le cas! L'URL n'est pas nécessaire de désigner une ressource existante. Il ne passera pas par toute transformation ou être résolu à une adresse de réseau. Même si les deux Url serait exactement la même chose, du moment qu'ils en diffèrent par un seul caractère, ils sont considérés comme des espaces de noms différents. Un identificateur d'espace de noms est juste une chaîne, et un sensible à la casse. Rien de plus.
Avec l'introduction des espaces de noms, le nom d'un élément XML ou de l'attribut soudain se compose de deux parties: un espace de noms et un nom local. Que "test" dans
<test/>
est seulement le nom local. Le soi-disant "nom complet" se compose d'un peu invisible combinaison de l'espace de noms et le nom local. Parfois la notation{namespace URI}local-name
est utilisé, mais ce n'est rien de plus que de convention.Alors maintenant, nous devons être en mesure d'utiliser des espaces de noms dans un document XML. Afin de déclarer l'espace de noms XML est codé en dur mécanisme. Il utilise la chaîne de caractères spéciaux
xmlns
pour permettre aux déclarations d'espace de noms pour être fait. Il peut être fait de deux façons: la liaison de l'espace de noms d'un préfixe, ou de déclarer l'espace de noms par défaut.Lors de la liaison à un préfixe, la forme est quelque chose comme ceci:
xmlns:prefix="namespace URI"
. Voici un exemple dans un document XML:Nous avons maintenant liés l'espace de noms
http://www.foo.com
pour le préfixefoo
. Où que ce préfixe est mis en face d'un élément ou d'attribut du nom, nous sommes en précisant qu'ils font partie de cet espace de noms.Ce qui est très important à noter ici est que le préfixe signifie absolument rien. Le document XML suivant est sémantiquement identiques:
Le préfixe est simplement un moyen commode de représenter l'espace de noms. Il nous évite d'avoir à utiliser l'URI entièrement à chaque fois.
La prochaine étape est l'espace de noms par défaut. Un espace de noms par défaut peut être déclarée avec
xmlns="namespace URI"
. Vous pourriez penser de façon abstraite de ce que la liaison d'un espace de noms pour le vide préfixe. Encore une fois le même document XML, mais cette fois sans les préfixes:C'est un peu plus commode de travailler avec. Alors pourquoi avoir de préfixes à tous? Ils commencent à jouer un rôle lorsque nous sommes en mélangeant le contenu de différents espaces de noms:
Cette fois, c'est un autre document XML. Notre
root
élément réside dans lahttp://www.foo.com
espace de noms, mais latest
élément réside danshttp://stackoverflow.com
parce que nous avons lié àso
préfixe et l'a utilisé surtest
.Vous remarquez également ici que les espaces de noms peut être déclaré sur tout élément dans le document XML. Le portée de cette déclaration (et de sa liaison avec le préfixe si applicable), puis devient l'élément et son contenu.
Cela peut parfois devenir source de confusion, d'autant plus que les déclarations peuvent écraser les unes les autres. Vérifiez ce document:
Prenez un moment pour comprendre ce que chaque élément de l'espace de noms est... C'est un bon exercice.
root
est dans l'espace de nomshttp://www.foo.com
. La premièretest
élément est également dans cet espace, puisque nous n'avons pas utilisé un préfixe, mais nous sommes dans le champ d'application de cet espace de noms par défaut. La deuxièmetest
élément avec le préfixeso
se trouve dans l'espace de nomshttp://www.stackoverflow.com
parce que c'est ce que nous avons lié le préfixe.Alors il y a la troisième, la plus intime
test
élément. Quel espace de noms est-il? Il n'a pas de préfixe, donc il doit être dans l'espace de noms par défaut. MAIS, nous avons changé notre espace de noms par défaut dans le deuxième essai élément! Alors, maintenant que intimes de l'élément appartient à lahttp://www.bar.com
espace de noms, pashttp://www.foo.com
.Confus encore? Juste rappeler les points suivants:
Ouf. Maintenant, sur des schémas XML du W3C. Comment tout cela se rapporte-t-il?
Bien, pour commencer Schéma XML lui-même est un langage de balisage défini en XML. Il va de soi que c'est de son propre espace de noms. Et cet espace de noms est officiellement
http://www.w3.org/2001/XMLSchema
. Si vous écrivez queS
que la baisse des cas, c'est mal. Commencer à voir pourquoi certaines personnes vraiment la haine des espaces de noms?Les trois documents suivants sont exactement les mêmes:
Tout ce qui compte, c'est que nous utilisons des trucs de l'espace de noms XML Schema. En tant que convention, cependant, les gens ont tendance à utiliser le préfixe
xs
ouxsd
dans les Schémas XML.Lorsque nous avons un document XML, on peut souhaiter pour spécifier où le schéma(s) sont situés. Plus d'un schéma peut être pertinent pour un document XML, parce que, comme nous l'avons dit langues peuvent être mélangés dans XML. Pour dire qu'un document XML est une instance d'un schéma, une fois de plus, il y a un espace de noms particulier disponible:
http://www.w3.org/2001/XMLSchema-instance
. Par convention, nous avons tendance à lier cet espace de noms pour préfixexsi
. Mais encore une fois, ce n'est pas obligatoire.Il ya une couple d'attributs définis dans le schéma de l'instance de l'espace de noms. Parmi eux,
schemaLocation
etnoNamespaceSchemaLocation
. Jetez un oeil à ce document:Ce qui s'est vraiment passé là-bas? D'abord, nous avons déclaré que nous sommes en liaison préfixe
xsi
à l'espace de nomshttp://www.w3.org/2001/XMLSchema-instance
. Alors nous avons utilisé un attribut au sein de cet espace de noms:noNamespaceSchemaLocation
. Cet attribut indique si le schéma est situé à valider les parties du document qui ne sont pas dans un espace de noms. Le document XML suivant est exactement la même chose, du point de vue sémantique:Rappelez-vous, les noms de préfixes n'ont pas de sens. Ils sont des espaces réservés. Alors, qu'est-ce que
noNamespaceSchemaLocation
attribut? En gros, il nous dit où l'on peut localiser un schéma. Maintenant, contrairement à un URI d'espace de noms, ce qui est le plus certainement quelque chose qui peut être utilisé pour récupérer des trucs à partir d'un réseau ou local de stockage. Un processeur XML qui est valide par rapport au schéma a déclaré dans un document peut essayer de les obtenir.Puis il ya le fait qu'il est appelé
noNamespaceSchemaLocation
. Un schéma définit un "espace de noms cible". Ce que cela ne fait état que de l'espace de noms des éléments et des attributs qu'il définit sont partie de. Mais l'espace de noms cible peut être omis. Dans ce cas, nous avons un schéma pour les documents XML sans espace de noms. Un tel schéma peut être cité de lanoNamespaceSchemaLocation
.Dans de nombreux cas, un schéma réellement définir un espace de noms. Pour dire de schéma qui appartient avec espace de noms, on peut utiliser un autre attribut de la
http://www.w3.org/2001/XMLSchema-instance
espace de noms:schemaLocation
. Cet attribut peut contenir des paires (séparés par des espaces) de l'espace de noms Uri et le schéma d'Uri. Supposons que nous avons un schéma pour l'espace de nomshttp://www.foo.com
situé àhttp://www.myschemas.com/foo-schema
. Ensuite, nous pouvons affirmer que, comme suit:Voici un exemple avec plusieurs espaces de noms à l'emplacement de paires:
Ce que vous devez retenir, c'est que
http://www.w3.org/2001/XMLSchema-instance
trucs pour une utilisation dans des documents XML qui sont des instances de schémas. L'espace de nomshttp://www.w3.org/2001/XMLSchema
est celle qui est utilisée pour la définition des schémas eux-mêmes.Donc, maintenant, nous en sommes à notre cou dans les Uri et les étranges attributs avec des significations particulières. C'est ça le truc avec les espaces de noms: ils ont l'air très complexe jusqu'à ce que vous comprendre comment de simples qu'ils sont. Il suffit de garder un œil sur ce préfixe est lié à ce que l'URI d'espace de noms, et de savoir ce que l'URI définit.
Il y a deux choses sur les schémas j'ai besoin de l'adresse de votre question:
xs:import
etxs:include
. Remarquez comment j'ai utilisé lexs
préfixe convention ici, puisque nous parlons des schémas XML du W3C.L'élément include peut être utilisé pour combiner les schémas avec le même espace de noms cible. Fondamentalement, il nous permet de modulariser les schémas en plus petits morceaux et les mettre ensemble.
L'importation élément ne sorte de la même chose, mais pour les schémas avec différents espaces de noms cible. Cela nous permet d'associer des schémas pour les différents langages de balisage.
Donc pour récapituler:
xmlns
: utilisé pour spécifier l'espace de noms par défaut.xmlns:prefix
: utilisé pour lier un espace de noms àprefix
.http://www.w3.org/2001/XMLSchema
: l'espace de noms XML Schéma. Par convention, souvent lié à préfixexs
mais ce n'est pas obligatoire, ni est-il fait automatiquement.http://www.w3.org/2001/XMLSchema-instance
: l'espace de noms qui définit un tas de choses utiles pour déclarer les détails de la façon dont un document XML est une instance d'un schéma. Par convention, souvent lié à préfixexsi
mais ce n'est pas obligatoire, ni est-il fait automatiquement.targetNamespace
: un attribut qui peut être utilisé dans le Schéma XML (sur l'élément racine) de préciser, pour qui l'espace de noms c'est une définition de schéma.schemaLocation
: l'un des attributs définis par l'espace de nomshttp://www.w3.org/2001/XMLSchema-instance
utilisé pour indiquer où l'un ou plusieurs schémas peuvent être trouvés par un ou plusieurs espaces de noms.Mon avis final: trouver une façon commode de valider les documents en fonction de schémas et de jouer un peu partout. Expérience avec les espaces de noms, les comprend et les importations. Rendre les documents à l'aide de plusieurs espaces de noms et d'essayer de la détermination de la portée.
Après cela, vérifiez les spécifications de XML lui-même, les espaces de noms XML et XML Schema. C'est hardcore de lecture, mais si vous faites votre chemin à travers elle, vous allez acquérir une compréhension de ce que beaucoup de gens semblent toujours manquer après des années d'utilisation de XML. Finalement, il va tous les sens.
Bonne chance!
En réponse à vos interrogations:
xmlns
- une valeur unique utilisé dans les documents d'instance pour indiquer le schéma XML est une instance de (ou de ce schéma, il validera contre). Même si l'espace de noms n'est pas d'identifier la réelle fichier de schéma, il devrait y avoir un schéma qui définit cet espace de noms.xmlns:xs
- disant préfixes d'espace de nomset par la convention utilisée dans les documents d'instance pour indiquer où les types utilisés dans le XML sont venant de. Vous pouvez considérer cela commeusing
en C# ouimports
en VB. Par exemple,xmlns:xs="http://mySharedTypes"
dit que dans ce XML certains de mes types viennent de l'espace de noms "http://mySharedTypes" et ces types seront préfixés par "xs".xmlns:xsi
- comme ci-dessus. Enfait le xs xsi préfixes sont, par convention, utilisé pour faire référence au schéma W3C espaces de noms http://www.w3.org/2001/XMLSchema et http://www.w3.org/2001/XMLSchema-instance. Cependant, ces préfixes d'espace de noms sont juste convention et peuvent être réellement quoi que ce soit.targetNamespace
- une valeur unique que vous mettez dans votre définition de schéma qui donne les types définis dans le schéma de leur espace de noms. Donc, si quelqu'un veut utiliser les types dans votre schéma, puis ils doivent inclure unexmlns
attribut avec les mêmes valeurs que votre targetNamespace.xs:import schemaLocation
- Ce qui est conventionnellement un chemin relatif vers un autre schéma, bien que pas tous les processeurs xml le reconnaître. De sorte que vous pouvez éventuellement lien vers un autre schéma dans votrexs:import
comme une sorte de raccourci vers le fichier de schéma lui-même. L'autre attribut dans l'importation est le schema targetNamespace, qui est obligatoire.xsi:schemaLocation
- Bien que ce partage le même nom que l'attribut import ce n'est pas la même définition. Par convention, la xsi préfixe d'espace de noms se réfère à des types de http://www.w3.org/2001/XMLSchema-instance espace de noms, qui sont utilisés à l'intérieur de l'instance de documents, plutôt que de documents de schéma.Désolé si ce qui précède n'est pas clair, c'est un peu d'une question ouverte et il y a une tonne de matériel que vous pourriez écrire pour l'un de ces points. Si vous avez besoin de clarté sur tout les points, veuillez le demander, je me ferai un plaisir de fournir, ou bien créer une nouvelle question à portée plus restreinte.
xmlns="uri1"
etxmlns:whatever="uri2"
sont nœud d'espace de noms et non pas les attributs. Leur rôle est-à-dire que lorsque vous les voyez dans votre document XML nomméwhatever:myElement
puis l'élément appartient à la "ce qui" espace de noms. Ce "quelle que soit l'espace de noms" est identifié par l'uri déclaré dans le nœud d'espace de noms.targetNamespace
est un attribut. Il contient un URI qui identifie les éléments, les types et le groupe que vous définissez dans votre schéma.xs:import
vous pouvez importer des schémas à partir d'espace de noms différent de l'utilisation de leurs éléments et les types dans votre propre schéma. Lors de l'utilisation dexs:import
le schéma importé et l'importation de schéma doit avoir différents noms. Utilisationxs:include
si c'est le même espace de noms.