XML文档赢得';t验证到XSD

XML文档赢得';t验证到XSD,xml,xsd,xml-validation,Xml,Xsd,Xml Validation,我正在尝试学习XML,我在网上找到了一个XML模式,并尝试制作了一个实例文档。由于某种我无法理解的原因,我的文档无法验证到模式。有人能指出我的错误吗 错误消息:原因:第2行错误:cvc elt。1:找不到 元素“movies”的声明 文档: <movies> <movie> <title>The Revenant</title> <length>120</length>

我正在尝试学习XML,我在网上找到了一个XML模式,并尝试制作了一个实例文档。由于某种我无法理解的原因,我的文档无法验证到模式。有人能指出我的错误吗

错误消息:原因:第2行错误:cvc elt。1:找不到 元素“movies”的声明

文档

<movies>
    <movie>
        <title>The Revenant</title>
        <length>120</length>
        <year>2015</year>
        <cast>
            <role ref="Lead">
            </role>
        </cast>
    </movie>
    <person id="Leo">
        <name>Leonardo DiCaprio</name>
        <birth>1982-12-13</birth>
    </person>
</movies>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:m="http://movies.example"
    targetNamespace="http://movies.example"
    elementFormDefault="qualified">

<element name="movies">
    <complexType>
        <sequence>
            <element ref="m:movie" minOccurs="0" maxOccurs="unbounded"/>
            <element ref="m:person" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
    </complexType>
    <unique name="movies-unique">
        <selector xpath="m:movie"/>
        <field xpath="m:title"/>
        <field xpath="m:year"/>
    </unique>
    <key name="cast-key">
        <selector xpath="m:person|m:star"/>
        <field xpath="@id"/>
    </key>
    <keyref refer="m:cast-key" name="cast-keyref">
        <selector xpath=".//m:role"/>
        <field xpath="@ref"/>
    </keyref>
</element>

<element name="movie">
    <complexType>
        <sequence>
            <element name="title" type="string"/>
            <element name="length" type="nonNegativeInteger"/>
            <element name="year" type="gYear"/>
            <element name="cast">
                <complexType>
                    <sequence maxOccurs="unbounded">
                        <element name="role">
                            <complexType mixed="true">
                                <attribute name="ref" type="NCName"/>
                            </complexType>
                        </element>
                    </sequence>
                </complexType>
            </element>
        </sequence>
    </complexType>
</element>

<element name="person" type="m:personType"/>

<complexType name="personType">
    <sequence>
        <element name="name" type="string"/>
        <element name="birth" type="date"/>
    </sequence>
    <attribute name="id" type="NCName"/>
</complexType>

<element name="star" substitutionGroup="m:person">
    <complexType>
        <complexContent>
            <extension base="m:personType">
                <sequence maxOccurs="unbounded">
                    <element name="award" type="string"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
</element>

</schema>

复仇者
120
2015
莱昂纳多·迪卡普里奥
1982-12-13
模式

<movies>
    <movie>
        <title>The Revenant</title>
        <length>120</length>
        <year>2015</year>
        <cast>
            <role ref="Lead">
            </role>
        </cast>
    </movie>
    <person id="Leo">
        <name>Leonardo DiCaprio</name>
        <birth>1982-12-13</birth>
    </person>
</movies>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:m="http://movies.example"
    targetNamespace="http://movies.example"
    elementFormDefault="qualified">

<element name="movies">
    <complexType>
        <sequence>
            <element ref="m:movie" minOccurs="0" maxOccurs="unbounded"/>
            <element ref="m:person" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
    </complexType>
    <unique name="movies-unique">
        <selector xpath="m:movie"/>
        <field xpath="m:title"/>
        <field xpath="m:year"/>
    </unique>
    <key name="cast-key">
        <selector xpath="m:person|m:star"/>
        <field xpath="@id"/>
    </key>
    <keyref refer="m:cast-key" name="cast-keyref">
        <selector xpath=".//m:role"/>
        <field xpath="@ref"/>
    </keyref>
</element>

<element name="movie">
    <complexType>
        <sequence>
            <element name="title" type="string"/>
            <element name="length" type="nonNegativeInteger"/>
            <element name="year" type="gYear"/>
            <element name="cast">
                <complexType>
                    <sequence maxOccurs="unbounded">
                        <element name="role">
                            <complexType mixed="true">
                                <attribute name="ref" type="NCName"/>
                            </complexType>
                        </element>
                    </sequence>
                </complexType>
            </element>
        </sequence>
    </complexType>
</element>

<element name="person" type="m:personType"/>

<complexType name="personType">
    <sequence>
        <element name="name" type="string"/>
        <element name="birth" type="date"/>
    </sequence>
    <attribute name="id" type="NCName"/>
</complexType>

<element name="star" substitutionGroup="m:person">
    <complexType>
        <complexContent>
            <extension base="m:personType">
                <sequence maxOccurs="unbounded">
                    <element name="award" type="string"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
</element>

</schema>

以下更新的XML将针对您的XSD成功验证:

<movies xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://movies.example"
        xsi:schemaLocation="http://movies.example try.xsd">
  <movie>
    <title>The Revenant</title>
    <length>120</length>
    <year>2015</year>
    <cast>
      <role ref="Leo"/>
    </cast>
  </movie>
  <person id="Leo">
    <name>Leonardo DiCaprio</name>
    <birth>1982-12-13</birth>
  </person>
</movies>

复仇者
120
2015
莱昂纳多·迪卡普里奥
1982-12-13
需要更新

<movies>
    <movie>
        <title>The Revenant</title>
        <length>120</length>
        <year>2015</year>
        <cast>
            <role ref="Lead">
            </role>
        </cast>
    </movie>
    <person id="Leo">
        <name>Leonardo DiCaprio</name>
        <birth>1982-12-13</birth>
    </person>
</movies>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:m="http://movies.example"
    targetNamespace="http://movies.example"
    elementFormDefault="qualified">

<element name="movies">
    <complexType>
        <sequence>
            <element ref="m:movie" minOccurs="0" maxOccurs="unbounded"/>
            <element ref="m:person" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
    </complexType>
    <unique name="movies-unique">
        <selector xpath="m:movie"/>
        <field xpath="m:title"/>
        <field xpath="m:year"/>
    </unique>
    <key name="cast-key">
        <selector xpath="m:person|m:star"/>
        <field xpath="@id"/>
    </key>
    <keyref refer="m:cast-key" name="cast-keyref">
        <selector xpath=".//m:role"/>
        <field xpath="@ref"/>
    </keyref>
</element>

<element name="movie">
    <complexType>
        <sequence>
            <element name="title" type="string"/>
            <element name="length" type="nonNegativeInteger"/>
            <element name="year" type="gYear"/>
            <element name="cast">
                <complexType>
                    <sequence maxOccurs="unbounded">
                        <element name="role">
                            <complexType mixed="true">
                                <attribute name="ref" type="NCName"/>
                            </complexType>
                        </element>
                    </sequence>
                </complexType>
            </element>
        </sequence>
    </complexType>
</element>

<element name="person" type="m:personType"/>

<complexType name="personType">
    <sequence>
        <element name="name" type="string"/>
        <element name="birth" type="date"/>
    </sequence>
    <attribute name="id" type="NCName"/>
</complexType>

<element name="star" substitutionGroup="m:person">
    <complexType>
        <complexContent>
            <extension base="m:personType">
                <sequence maxOccurs="unbounded">
                    <element name="award" type="string"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
</element>

</schema>
  • 添加了默认名称空间(
    xmlns=”http://movies.example“
    )以匹配 XSD的
    targetNamespace
  • role/@ref
    值更改为
    “Leo”
    ,以满足
    cast keyref
    XSD的约束

  • 值得注意的是,xsi:schemaLocation属性通常不是必需的,尽管XMLSpy和其他工具经常插入它。唯一需要的更改是添加默认命名空间声明:

    <movies xmlns="http://movies.example">
      <movie>
        <title>The Revenant</title>
        <length>120</length>
        <year>2015</year>
        <cast>
          <role ref="Leo"/>
        </cast>
      </movie>
      <person id="Leo">
        <name>Leonardo DiCaprio</name>
        <birth>1982-12-13</birth>
      </person>
    </movies>
    
    
    复仇者
    120
    2015
    莱昂纳多·迪卡普里奥
    1982-12-13
    
    (为了让OP的XML工具开心,xsi:schemaLocation可能仍然是必需的)

    (a)没有人说需要
    xsi:schemaLocation
    ;(b) 您关于“唯一需要的更改是添加默认名称空间声明”的陈述是不正确的;如我所知,需要进行两次更新。