it-swarm.dev

Validação de esquema XML: Não é possível encontrar a declaração do elemento

Ainda sou um pouco novo no XML Schema etc. e tenho trabalhado para desenvolver XML, Schema e uma Stylesheet (XSLT). Fiz um progresso razoável, mas depois percebi que meu esquema havia parado de funcionar, por isso levei de volta a um exemplo não descritivo mais simples.

Aqui está o meu 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>

Eu escrevi um esquema que está aqui:

<?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>

O esquema é representativo da estrutura do meu XML real.

Agora, quando tento validar meu XML, recebo este erro:

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

Acho que isso tem a ver com um problema de espaço para nome no elemento Root, mas não tenho muita certeza.

Alguém pode sugerir o que estou fazendo de errado, por favor.

20
Nerdio

cvc-elt.1: Não foi possível encontrar a declaração do elemento 'Root'. [7]

Seu atributo schemaLocation no elemento raiz deve ser xsi:schemaLocation, e você precisa corrigi-lo para usar o espaço para nome correto.

Provavelmente, você deve alterar o targetNamespace do esquema e o xmlns do documento para http://myNameSpace.com (já que os espaços para nome devem ser URIs válidos, que Test.Namespace não é, embora urn:Test.Namespace seria bom). Depois de fazer isso, ele deve encontrar o esquema. O ponto é que todos os três espaços para nome de destino do esquema, espaço para nome do documento e espaço para nome para o qual você está dando a localização do esquema devem ser os mesmos.

(embora ainda não seja validado como seu <element2> contém um <element3> no documento em que o esquema espera item)

18
Ian Roberts

Obrigado a todos acima, mas agora isso foi corrigido. Para o benefício de outros, o erro mais significativo foi o alinhamento dos três espaços para nome, conforme sugerido por Ian.

Para completar, eis os XML e XSD corrigidos

Aqui está o XML, com os erros de digitação corrigidos (desculpe por qualquer confusão causada por atraso)

<?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>

e aqui está o esquema

<?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>

Mais uma vez obrigado a todos, espero que seja útil para outra pessoa no futuro.

21
Nerdio

O targetNamespace do seu esquema XML não corresponde ao espaço de nome do elemento Root (ponto em Test.Namespace vs. vírgula em Test,Namespace)

Depois de concordar, você deve considerar que seu element2 tem um atributo order que não está no seu XSD.

1
Petru Gardea