Нет подходящего глобального объявления для корневого элемента валидации - PullRequest
46 голосов
/ 08 декабря 2011

Фон

Проверка XML-документа с использованием схемы.

Проблема

Простейшая форма проблемы показана в двух файлах.

XML-документ

<?xml version="1.0"?>

<recipe
  xmlns:r="http://www.namespace.org/recipe">

<r:description>
  <r:title>sugar cookies</r:title>
</r:description>

</recipe>

Документ XSD

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema
   version="1.0"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:r="http://www.namespace.org/recipe">

  <xsd:complexType name="recipe">
    <xsd:choice>
      <xsd:element name="description" type="descriptionType"
        minOccurs="1" maxOccurs="1" />
    </xsd:choice>
  </xsd:complexType>

  <xsd:complexType name="descriptionType">
    <xsd:all>
      <xsd:element name="title">
        <xsd:simpleType>
          <xsd:restriction base="xsd:string">
            <xsd:minLength value="5" />
            <xsd:maxLength value="55" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:element>
    </xsd:all>
  </xsd:complexType>
</xsd:schema>

Error

Полное сообщение об ошибке от xmllint :

file.xml: 4: рецепт элемента: ошибка валидности схемы: элемент "рецепт": для корня валидации нет доступного глобального объявления.

Вопрос

Каков правильный синтаксис (или какие атрибуты схемы отсутствуют), чтобы обеспечить возможность использования данной схемы для успешной проверки данного XML-документа?

Ответы [ 3 ]

26 голосов
/ 08 декабря 2011

Вам нужно изменить свой экземпляр XML.Ваш текущий говорит, что в пространстве имен description есть тип http://www.namespace.org/recipe. Однако в вашем определении XSD единственные типы, представленные в этом пространстве имен, называются recipe и descriptionType .

Так что либо определите тип с именем description в схеме XSD, либо измените свой экземпляр, чтобы вы правильно ссылались на тип recipe :

<?xml version="1.0" encoding="utf-8"?>
<r:recipe
  xmlns:r="http://www.namespace.org/recipe">
  <description>
    <title>sugar cookies</title>
  </description>
</r:recipe>

ОБНОВЛЕНИЕ Это только половина решения - другая половина в ответе Аравинда здесь: https://stackoverflow.com/a/8426185/569662

14 голосов
/ 08 декабря 2011

Только глобальные определения элементов могут быть использованы в качестве корневых элементов. Ваша схема имеет только сложные типы и, следовательно, ошибку. Измените <xsd:complexType name="recipe"> на

<xsd:element name="recipe">
  <xsd:complexType>
    <xsd:choice>
      <xsd:element name="description" type="descriptionType"
        minOccurs="1" maxOccurs="1" />
    </xsd:choice>
  </xsd:complexType>
</xsd:element>

Подробнее об этом здесь

4 голосов
/ 05 февраля 2018

В моей практике я получил No matching global declaration available for the validation root в двух случаях:

  • Если XSD не содержит <xsd:element name="recipe" .../>, объясненного в ответе @ aravind-r-yarram.
  • Если <recipe/> в XML не содержит атрибута xmlns.В таком случае добавление xmlns поможет:

    <recipe xmlns="http://www.namespace.org/recipe">
        ...
    </recipe>
    
...