Проверка схемы XML: не удается найти объявление элемента

Я все еще немного новичок в XML-схеме и т. Д. И работаю над разработкой XML, Schema и Stylesheet (XSLT). Я добился разумного прогресса, но потом понял, что моя схема перестала работать, поэтому я вернул ее к более простому неописанному примеру.

Вот мой 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>

Я написал схему, которая здесь:

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

Схема представляет структуру моего реального XML.

Теперь, когда я пытаюсь проверить мой XML, я получаю эту ошибку:

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

Я думаю, что это связано с проблемой пространства имен в элементе Root, но я действительно не уверен.

Может кто-нибудь подсказать, что я делаю не так, пожалуйста.

4 ответа

Решение

cvc-elt.1: не удается найти объявление элемента 'Root'. [7]

Ваш schemaLocation атрибут на корневом элементе должен быть xsi:schemaLocationи вам нужно исправить это, чтобы использовать правильное пространство имен.

Вы, вероятно, должны изменить targetNamespace схемы и тому xmlns документа для http://myNameSpace.com (поскольку пространства имен должны быть действительными URI, которые Test.Namespace нет, хотя urn:Test.Namespace было бы хорошо). Как только вы это сделаете, он должен найти схему. Дело в том, что все три целевого пространства имен схемы, пространства имен документа и пространства имен, для которых вы указываете расположение схемы, должны быть одинаковыми.

(хотя он все равно не будет подтвержден как ваш <element2> содержит <element3> в документе, где ожидает схема item)

Спасибо всем выше, но это сейчас исправлено. В интересах других наиболее существенная ошибка заключалась в выравнивании трех пространств имен, как это было предложено Яном.

Для полноты вот исправленные XML и XSD

Вот XML, с исправленными опечатками (извините за путаницу из-за опозданий)

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

и вот схема

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

Еще раз спасибо всем, я надеюсь, что это пригодится кому-то еще в будущем.

targetNamespace вашей XML-схемы не соответствует пространству имен корневого элемента (точка в Test.Namespace против запятой в Test,Namespace)

После того, как вы согласитесь с вышесказанным, вы должны учитывать, что element2 имеет порядок атрибутов, которого нет в вашем XSD.

Моя ошибка заключалась в том, что у меня было более одного корневого узла, который был добавлен vscode/codium, когда я нажал «Быстрое исправление»:

и решил показать XML-схему во второй строке (что неверно, так как это привело к двум начальным узлам):

и наведение на "Поток" (в вашем случае "Корень") показало мне ошибку.

В конце концов, код проверки схемы xml по сравнению с xsd показал, что добавление дополнительной второй строки является неправильным XML. Вместо этого я не должен возражать против трех серых точек/быстрого исправления на первом снимке экрана, XML был правильным с самого начала.

Другие вопросы по тегам