2013-03-26 18 views
15

Wciąż jestem nowicjuszem w schemacie XML itp. I pracowałem nad opracowaniem XML, schematu i arkusza stylów (XSLT). Dokonałem rozsądnych postępów, ale potem zdałem sobie sprawę, że mój schemat przestał działać, więc zabrałem go z powrotem do prostszego, nieobjaśniającego przykładu.Sprawdzanie poprawności schematu XML: Nie można odnaleźć deklaracji elementu

Tu jest mój 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> 

Pisałem schematu, który jest tutaj:

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

schematu jest reprezentatywna dla struktury mojego prawdziwego XML.

Teraz, gdy próbuję zweryfikować XML, otrzymuję ten błąd:

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

To moim zdaniem jest zrobić z kwestii nazw na element główny, ale nie jestem pewien.

Czy ktoś może zasugerować, co robię źle, proszę.

Odpowiedz

14

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

atrybutu schemaLocation na elemencie głównym powinny być xsi:schemaLocation i trzeba go naprawić, aby użyć prawego nazw.

Powinieneś raczej zmienić targetNamespace schematu i xmlns dokumentu do http://myNameSpace.com (od nazw mają być ważne URI, który Test.Namespace nie jest, choć urn:Test.Namespace byłoby ok). Gdy to zrobisz, powinien znaleźć schemat. Chodzi o to, że wszystkie trzy docelowe obszary nazw schematu, przestrzeń nazw dokumentu i przestrzeń nazw, dla której podajesz lokalizację schematu, muszą być takie same.

(choć nadal nie będzie zweryfikować jako swój <element2> zawiera <element3> w dokumencie, w którym schemat spodziewa item)

+3

Poprawiłem następujące sugestie, a teraz działa Potrzebowałem wyjaśnienia "Trzech" Przestrzeni nazw. – Nerdio

1

targetNamespace Twojego XML Schema nie zgadza się przestrzeń nazw głównej elementu (kropka w Test.Namespace vs. przecinek w Test,Namespace)

Po dokonaniu powyższego zgodzić, trzeba wziąć pod uwagę, że ma element2 atrybut zamówienie, którego nie ma w Twoim XSD.

+0

Dziękuję za to i zauważam dwa oczywiste błędy. Poprawiłem je; 'kod' <= "XML wersja 1.0" Kodowanie = "UTF-8"?> 'kod' (Przykro mi, ale nie wydaje się, że prawidłowo włożona kod). Problem nadal występuje ... – Nerdio

17

Dziękujemy wszystkim powyżej, ale to jest już ustalona. Dla dobra innych osób najbardziej znaczącym błędem było wyrównanie trzech przestrzeni nazw zgodnie z sugestią Iana.

Dla kompletności, tutaj jest korygowane XML i XSD

Oto XML, przy czym literówki poprawione (przepraszam za zamieszanie spowodowane przez opieszałość)

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

, a tutaj jest schemat

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

Jeszcze raz dziękuję wszystkim, mam nadzieję, że przyda się to komuś innemu w przyszłości.

+4

Jeśli mogę zasugerować kilka poprawek w twojej odpowiedzi: powinieneś odrzucić moją odpowiedź, poczekać dzień myślę, a następnie zaakceptować twoją, ponieważ technicznie rzecz biorąc twoja zawiera wszystkie poprawki; Naprawiłbym również część NID z was URN, która jest nieważna (usuń ".", Który jest nieprawidłowy dla NID), a także dodaj obowiązkową część NSS, oddzieloną przez kolejne ':'. SchemaLocation to tylko wskazówka, a weryfikatory XSD mogą je zignorować, jeśli nie ze względów bezpieczeństwa - dlatego nigdy nie powinno być powodem, dla którego XML jest nieważny. –

Powiązane problemy