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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top