在XSD中,如何使用相同的名称定义两个不同的元素?

在XSD中,如何使用相同的名称定义两个不同的元素?,xsd,Xsd,我在制作xsd文件时遇到问题。我需要一个xsd文件,用于xml文档,该文件如下所示: <message type="login"> <login nick="Ben" gameId="chess" desiredRole="simple "/> </message> <xsd:element name ='message' type='messageType'> </xsd:element> <xsd:complexTyp

我在制作
xsd
文件时遇到问题。我需要一个
xsd
文件,用于
xml
文档,该文件如下所示:

<message type="login">
  <login nick="Ben" gameId="chess" desiredRole="simple "/>
</message>
<xsd:element name ='message' type='messageType'>
</xsd:element>

<xsd:complexType name='messageType'/>
  <xsd:complexType name='error'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='error'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name='login'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:sequence>
          <xsd:element name='login'>
            <xsd:complexType>
              <xsd:attribute name='nick' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='gameId' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='desiredRole' type='xsd:string' use='required'>
              </xsd:attribute>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='login'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="messageType"/>

  <xsd:simpleType name="typeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="login"/>
      <xsd:enumeration value="error"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:element name="login">
    <xsd:complexType>
      <xsd:attribute name='nick'        type='xsd:string' use='required'/>
      <xsd:attribute name='gameId'      type='xsd:string' use='required'/>
      <xsd:attribute name='desiredRole' type='xsd:string' use='required'/>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name='messageType'/>
    <xsd:sequence>
      <xsd:element ref="login" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="typeType" use="required"/>
  </xsd:complexType>
</xsd:schema>
但是它不起作用(我得到一个错误,没有定义属性类型)。谁能帮我一下吗?

怎么样

<message>
    <login />
</message>


也就是说,不要使用type属性,消息中始终有一个元素。

怎么样

<message>
    <login />
</message>



也就是说,不要使用type属性,在消息中始终包含一个元素。

XSD不允许您精确地执行您想要执行的操作,即创建一个根据属性值具有不同结构的元素。但是,如果确实需要该元素具有类似这样的不同结构,则可以创建允许所有可能结构的元素定义。您不能让解析器自动验证它,以证明它完全符合一个定义或另一个定义。无论如何都不在XSD内

试着这样做:

<message type="login">
  <login nick="Ben" gameId="chess" desiredRole="simple "/>
</message>
<xsd:element name ='message' type='messageType'>
</xsd:element>

<xsd:complexType name='messageType'/>
  <xsd:complexType name='error'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='error'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name='login'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:sequence>
          <xsd:element name='login'>
            <xsd:complexType>
              <xsd:attribute name='nick' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='gameId' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='desiredRole' type='xsd:string' use='required'>
              </xsd:attribute>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='login'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="messageType"/>

  <xsd:simpleType name="typeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="login"/>
      <xsd:enumeration value="error"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:element name="login">
    <xsd:complexType>
      <xsd:attribute name='nick'        type='xsd:string' use='required'/>
      <xsd:attribute name='gameId'      type='xsd:string' use='required'/>
      <xsd:attribute name='desiredRole' type='xsd:string' use='required'/>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name='messageType'/>
    <xsd:sequence>
      <xsd:element ref="login" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="typeType" use="required"/>
  </xsd:complexType>
</xsd:schema>

XSD不允许您精确地执行您想要执行的操作,即创建一个根据属性值具有不同结构的元素。但是,如果确实需要该元素具有类似这样的不同结构,则可以创建允许所有可能结构的元素定义。您不能让解析器自动验证它,以证明它完全符合一个定义或另一个定义。无论如何都不在XSD内

试着这样做:

<message type="login">
  <login nick="Ben" gameId="chess" desiredRole="simple "/>
</message>
<xsd:element name ='message' type='messageType'>
</xsd:element>

<xsd:complexType name='messageType'/>
  <xsd:complexType name='error'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='error'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

  <xsd:complexType name='login'>
    <xsd:complexContent>
      <xsd:extension base='messageType'>
        <xsd:sequence>
          <xsd:element name='login'>
            <xsd:complexType>
              <xsd:attribute name='nick' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='gameId' type='xsd:string' use='required'>
              </xsd:attribute>
              <xsd:attribute name='desiredRole' type='xsd:string' use='required'>
              </xsd:attribute>
            </xsd:complexType>
          </xsd:element>
        </xsd:sequence>
        <xsd:attribute name ='type' use='required'>
          <xsd:simpleType>
            <xsd:restriction base='xsd:string'>
              <xsd:enumeration value='login'/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:attribute>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>

</xsd:schema>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="message" type="messageType"/>

  <xsd:simpleType name="typeType">
    <xsd:restriction base="xsd:string">
      <xsd:enumeration value="login"/>
      <xsd:enumeration value="error"/>
    </xsd:restriction>
  </xsd:simpleType>

  <xsd:element name="login">
    <xsd:complexType>
      <xsd:attribute name='nick'        type='xsd:string' use='required'/>
      <xsd:attribute name='gameId'      type='xsd:string' use='required'/>
      <xsd:attribute name='desiredRole' type='xsd:string' use='required'/>
    </xsd:complexType>
  </xsd:element>

  <xsd:complexType name='messageType'/>
    <xsd:sequence>
      <xsd:element ref="login" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute name="type" type="typeType" use="required"/>
  </xsd:complexType>
</xsd:schema>