代码之家  ›  专栏  ›  技术社区  ›  Jonathan Collins

XML架构错误:内容模型(名称)不允许使用元素“名称”

xml
  •  0
  • Jonathan Collins  · 技术社区  · 6 年前

    我是XML新手,正在努力让我的第一个XML模式正确验证预先制作的XML文档。这可能是一个相当基本的问题,但我找不到一个好的答案,也完全不理解这个问题。

    以下是我的XML文档:

        <?xml version="1.0" encoding="UTF-8"?>
        <x:presentations xmlns:x="jon:presentations"
                              xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
                              xs:schemaLocation="jon:presentations presentations.xsd">
          <presentation date="2013-07-31" length="PT30M">
            <topic genre="Music">PianoML</topic>
            <presenters>
              <name title="Mr." id="Y258">
                <first>Elvis</first>
                <middle>A</middle>
                <last>Presley </last>
              </name>
              <name title="Miss" id="X365">
                <first>Lady</first>
                <last>Gaga</last>
              </name>
            </presenters>
          </presentation>
            <presentation date="2013-08-05" length="PT35M">
            <topic genre="Science">AlienML</topic>
            <presenters>
                 <name title="Mr." id="Y007">
                <first>Will</first>
                <last>Smith</last>
              </name>
              <name title="Mr." id="Y360">
                <first>Tommy</first>
                <first>Lee</first>
                <last>Jones</last>
              </name>
            </presenters>
          </presentation>
        </x:presentations>
    

    这是我的模式:

        <?xml version="1.0" encoding="UTF-8"?>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            targetNamespace="jon:presentations"
                            xmlns:prs="jon:presentations">
          <xs:element name = "presentations">
            <xs:complexType>
              <xs:sequence>
                <xs:element name = "presentation">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name = "topic">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="genre">
                              <xs:simpleType>
                                <xs:restriction base="xs:string">
                                <xs:enumeration value="Art"/>
                                <xs:enumeration value="Music"/>
                                <xs:enumeration value="Science"/>
                                <xs:enumeration value="Technology"/>
                                </xs:restriction>
                              </xs:simpleType>
                            </xs:attribute>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="presenters">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="name">
                            <xs:complexType mixed="true">
                              <xs:sequence>
                                <xs:element name="first" type="xs:string"
                                                    minOccurs="1" maxOccurs="unbounded"/>
                                <xs:element name="middle" type="xs:string"
                                                    minOccurs="0" maxOccurs="1"/>
                                <xs:element name="last" type="xs:string"/>
                              </xs:sequence>
                                <xs:attribute name="title" use="required">
                                  <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                      <xs:enumeration value="Mr."/>
                                      <xs:enumeration value="Mrs."/>
                                      <xs:enumeration value="Ms."/>
                                      <xs:enumeration value="Miss"/>
                                    </xs:restriction>
                                  </xs:simpleType>
                                </xs:attribute>
                                <xs:attribute name="id">
                                  <xs:simpleType>
                                    <xs:restriction base="xs:ID">
                                      <xs:pattern value="[X-Y][0-9][0-9][0-9]"/>
                                    </xs:restriction>
                                  </xs:simpleType>
                                </xs:attribute>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="date" type="xs:date">
                  </xs:attribute>
                  <xs:attribute name="length" type="xs:duration">
                  </xs:attribute>
                </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:schema>
    

    我一点也不知道为什么,但当我尝试验证xml文档时,第17行出现了一个错误,称内容模型(name)不允许使用元素“name”

    我需要弄清楚如何更改模式,以便正确验证。

    我真的很感谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Ashish Shetkar    6 年前

    您刚刚错过了序列的minOuccur和maxoccure属性,对于验证XML的XSD模式——在您的序列中,您需要提到minOccur和maxoccure属性——例如在您的示例中

    演示文稿和名称可以按顺序出现-因此添加

    minOccurs="1" maxOccurs="unbounded">
    

    关于姓名顺序和演示顺序,请查看更改并告诉我是否有用

     <?xml version="1.0" encoding="UTF-8"?>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                            targetNamespace="jon:presentations"
                            xmlns:prs="jon:presentations">
          <xs:element name = "presentations">
            <xs:complexType>
              <xs:sequence minOccurs="1" maxOccurs="unbounded">
                <xs:element name = "presentation">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name = "topic">
                      <xs:complexType>
                        <xs:simpleContent>
                          <xs:extension base="xs:string">
                            <xs:attribute name="genre">
                              <xs:simpleType>
                                <xs:restriction base="xs:string">
                                <xs:enumeration value="Art"/>
                                <xs:enumeration value="Music"/>
                                <xs:enumeration value="Science"/>
                                <xs:enumeration value="Technology"/>
                                </xs:restriction>
                              </xs:simpleType>
                            </xs:attribute>
                          </xs:extension>
                        </xs:simpleContent>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="presenters">
                      <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="unbounded">
                          <xs:element name="name">
                            <xs:complexType mixed="true">
                              <xs:sequence>
                                <xs:element name="first" type="xs:string"
                                                    minOccurs="1" maxOccurs="unbounded"/>
                                <xs:element name="middle" type="xs:string"
                                                    minOccurs="0" maxOccurs="1"/>
                                <xs:element name="last" type="xs:string"/>
                              </xs:sequence>
                                <xs:attribute name="title" use="required">
                                  <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                      <xs:enumeration value="Mr."/>
                                      <xs:enumeration value="Mrs."/>
                                      <xs:enumeration value="Ms."/>
                                      <xs:enumeration value="Miss"/>
                                    </xs:restriction>
                                  </xs:simpleType>
                                </xs:attribute>
                                <xs:attribute name="id">
                                  <xs:simpleType>
                                    <xs:restriction base="xs:ID">
                                      <xs:pattern value="[X-Y][0-9][0-9][0-9]"/>
                                    </xs:restriction>
                                  </xs:simpleType>
                                </xs:attribute>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="date" type="xs:date">
                  </xs:attribute>
                  <xs:attribute name="length" type="xs:duration">
                  </xs:attribute>
                </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:schema>