Проверка схемы XML: не удается найти объявление элемента
Я все еще немного новичок в XML Schema и т.д., и я работал над разработкой некоторых XML, схем и стилей (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, но я действительно не уверен.
Может кто-то подскажет, что я делаю неправильно.
Ответы
Ответ 1
cvc-elt.1: Не удается найти объявление элемента "Root". [7]
Ваш атрибут schemaLocation
в корневом элементе должен быть xsi:schemaLocation
, и вам нужно исправить его, чтобы использовать правильное пространство имен.
Вероятно, вы должны изменить targetNamespace
схемы и xmlns
документа на http://myNameSpace.com
(так как пространства имен должны быть допустимыми URI, что Test.Namespace
не является, хотя urn:Test.Namespace
будет ОК). Как только вы это сделаете, он найдет схему. Дело в том, что все три пространства имен целевой схемы, пространство имен документов и пространство имен, для которых вы указываете расположение схемы, должны быть одинаковыми.
(хотя он все равно не будет проверяться, так как ваш <element2>
содержит <element3>
в документе, где схема ожидает item
)
Ответ 2
Спасибо всем выше, но теперь это исправлено. В интересах других наиболее значимой ошибкой было согласование трех пространств имен, предложенных Яном.
Для полноты здесь приведены исправленные 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>
Еще раз спасибо всем, я надеюсь, что это будет полезно для кого-то еще в будущем.
Ответ 3
targetNamespace
вашей XML-схемы не соответствует пространству имен элемента Root (точка в Test.Namespace
против запятой в Test,Namespace
)
Как только вы согласитесь, вы должны учитывать, что ваш element2
имеет атрибут order, который не входит в ваш XSD.