Проверка схемы 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 был правильным с самого начала.