我在制作xsd
文件时遇到问题。我需要xsd
个xml
文件的文件,如下所示:
<message type="login">
<login nick="Ben" gameId="chess" desiredRole="simple "/>
</message>
或者像这样
<message type="error">
Error message
</message>
意味着始终存在message
标记,但它具有不同的属性type
值,并且根据类型值,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>
但它不起作用(我收到一个错误,即未定义属性类型)。有人可以帮帮我吗?
答案 0 :(得分:2)
怎么样
<message>
<login />
</message>
和
<message>
<error />
</message>
也就是说,不要使用type属性,并且在消息中始终有一个元素。
答案 1 :(得分:1)
XSD不允许您精确地执行您想要执行的操作,即根据属性值创建具有不同结构的元素。但是,如果您确实需要此元素具有这样的不同结构,则可以创建允许所有可能结构的元素定义。您只是不能让解析器自动验证它,以证明它只符合一个定义或另一个定义。无论如何都不在XSD范围内。
尝试这样的事情:
<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>