57

背景

使用模式验证 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>

错误

来自xmllint的完整错误消息:

file.xml:4:元素配方:模式有效性错误:元素“配方”:没有可用于验证根的匹配全局声明。

问题

什么是正确的语法(或缺少哪些模式属性)以确保可以使用给定的模式来成功验证给定的 XML 文档?

4

3 回答 3

30

您需要更改您的 XML 实例。您当前的说在名称空间http://www.namespace.org/recipe中有一种称为description的类型。但是,在您的 XSD 定义中,该命名空间中公开的唯一类型称为recipedescriptionType

因此,要么在 XSD 架构中定义一个名为description的类型,要么更改您的实例,以便正确引用配方类型:

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

更新这只是解决方案的一半 - 另一半在@​​Aravind的回答中:https ://stackoverflow.com/a/8426185/569662

于 2011-12-08T08:19:56.537 回答
17

只有全局元素定义可以用作根元素。您的架构只有复杂的类型,因此有错误。更改 <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>

在此处阅读有关此的更多信息

于 2011-12-08T04:31:28.867 回答
8

在我的实践中,我得到了No matching global declaration available for the validation root两种情况:

  • 如果 XSD 不包含@aravind-r-yarram 的答案<xsd:element name="recipe" .../>中的解释。

  • 如果<recipe/>在 XML 中不包含xmlns属性。在这种情况下,添加xmlns将有助于:

      <recipe xmlns="http://www.namespace.org/recipe">
          ...
      </recipe>
    
于 2018-02-05T16:19:27.227 回答