XML Schema: problèmes lors de l'importation Namespace éléments partagés
-
26-09-2019 - |
Question
Lorsque vous essayez d'importer des définitions partagées à partir d'un schéma XML, je peux référencer correctement les types partagés, mais le référencement des éléments partagés provoque des erreurs de validation.
Ceci est le schéma qui importe les définitions partagées (example.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:shared="http://shared.com">
<xs:import namespace="http://shared.com" schemaLocation="shared.xsd"/>
<xs:element name="example">
<xs:complexType>
<xs:sequence>
<xs:element ref="importedElement"/>
<xs:element ref="importedType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedElement">
<xs:complexType>
<xs:sequence>
<xs:element ref="shared:fooElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="importedType">
<xs:complexType>
<xs:sequence>
<xs:element name="bar" type="shared:barType"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Ce sont les définitions communes (shared.xsd):
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns="http://shared.com"
targetNamespace="http://shared.com">
<xs:element name="fooElement">
<xs:simpleType>
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:element>
<xs:simpleType name="barType">
<xs:restriction base="xs:integer"/>
</xs:simpleType>
</xs:schema>
Considérons maintenant cette instance XML:
<?xml version="1.0"?>
<example
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="example.xsd">
<importedElement>
<fooElement>42</fooElement>
</importedElement>
<importedType>
<bar>42</bar>
</importedType>
</example>
En cas de validation, la « importedType » fonctionne parfaitement bien, mais le « importedElement » donne l'erreur suivante:
Contenu non valide a été trouvé en commençant par l'élément « fooElement ». L'un des '{ " http://shared.com ": fooElement} devrait
Je suppose que mes problèmes sont liés à des problèmes d'espace de noms (d'où l'induire en erreur en quelque sorte « obtenu fooElement mais s'attendait fooElement ») - des conseils sur ce qui ne va pas ici
La solution
Vous faites référence à fooElement
comme si elle était en aucun espace de noms, vous devez utiliser l'espace de noms correct dans votre document d'instance:
<?xml version="1.0"?>
<example
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="example.xsd" xmlns:shared="http://shared.com">
<importedElement>
<shared:fooElement>42</shared:fooElement>
</importedElement>
<importedType>
<bar>42</bar>
</importedType>
</example>
Modifier Je aurait dû signaler: ce sont les différences entre types et éléments ; que ceux-ci apparaissent dans les documents (à quelques exceptions près), voilà pourquoi vos travaux de type importés que vous vouliez, et votre élément ne fonctionne pas.