web-dev-qa-db-fra.com

Validation du schéma XML: impossible de trouver la déclaration de l'élément

Je suis encore un peu nouveau sur le schéma XML, etc. et j'ai travaillé pour développer du XML, un schéma et une feuille de style (XSLT). J'ai fait des progrès raisonnables, mais je me suis ensuite rendu compte que mon schéma avait cessé de fonctionner, je l'ai donc repris à un exemple non descriptif plus simple.

Voici mon XML:

<?xml version="1.0" encoding="UTF-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="Test.Namespace"  
      schemaLocation="http://myNameSpace.com Test1.xsd">
    <element1 id="001">
        <element2 id="001.1">
             <element3 id="001.1" />
        </element2>
    </element1>
</Root>

J'ai écrit un schéma qui est ici:

<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="item" type="element3Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element3Type">
         <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
 </xsd:schema>

Le schéma est représentatif de la structure de mon vrai XML.

Maintenant, lorsque j'essaie de valider mon XML, j'obtiens cette erreur:

cvc-elt.1: Cannot find the declaration of element 'Root'. [7]

Je pense que cela est dû à un problème d'espace de noms sur l'élément racine, mais je ne suis vraiment pas sûr.

Quelqu'un peut-il suggérer ce que je fais mal s'il vous plaît.

20
Nerdio

cvc-elt.1: Impossible de trouver la déclaration de l'élément 'Root'. [7]

Votre attribut schemaLocation sur l'élément racine doit être xsi:schemaLocation, et vous devez le corriger pour utiliser le bon espace de noms.

Vous devriez probablement changer le targetNamespace du schéma et le xmlns du document en http://myNameSpace.com (puisque les espaces de noms sont censés être des URI valides, qui Test.Namespace non, mais urn:Test.Namespace Serait bien). Une fois que vous avez fait cela, il devrait trouver le schéma. Le fait est que les trois espaces de noms cibles du schéma, l'espace de noms du document et l'espace de noms pour lesquels vous donnez l'emplacement du schéma doivent être identiques.

(bien qu'il ne soit toujours pas validé comme votre <element2> contient un <element3> dans le document où le schéma attend item)

18
Ian Roberts

Merci à tout le monde ci-dessus, mais cela est maintenant corrigé. Pour le bénéfice des autres, l'erreur la plus importante a été d'aligner les trois espaces de noms comme l'a suggéré Ian.

Pour être complet, voici le XML corrigé et le XSD

Voici le XML, avec les fautes de frappe corrigées (désolé pour toute confusion causée par le retard)

<?xml version="1.0" encoding="UTF-8"?>

<Root
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="urn:Test.Namespace"  
    xsi:schemaLocation="urn:Test.Namespace Test1.xsd"
    >
    <element1 id="001">
        <element2 id="001.1">
            <element3 id="001.1" />
        </element2>
    </element1>
</Root>

et voici le schéma

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:Test.Namespace"
            xmlns="urn:Test.Namespace"
            elementFormDefault="qualified">
    <xsd:element name="Root">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="element1" maxOccurs="unbounded" type="element1Type"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="element1Type">
        <xsd:sequence>
            <xsd:element name="element2" maxOccurs="unbounded" type="element2Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element2Type">
        <xsd:sequence>
            <xsd:element name="element3" type="element3Type"/>
        </xsd:sequence>
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="element3Type">
        <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>        
</xsd:schema>

Merci encore à tout le monde, j'espère que cela sera utile à quelqu'un d'autre à l'avenir.

21
Nerdio

Le targetNamespace de votre schéma XML ne correspond pas à l'espace de noms de l'élément Root (point dans Test.Namespace vs virgule dans Test,Namespace)

Une fois que vous avez accepté ce qui précède, vous devez considérer que votre element2 a un attribut order qui n'est pas dans votre XSD.

1
Petru Gardea