Como declarar esquema XML caso especial (XSD)
Pergunta
Eu preciso de sua ajuda para definir um caso especial no esquema XML: Uma sequência que contém dois elementos: 'x' e 'y' enquanto que:
-
elemento
<x>
pode aparecer a 0 vezes não ligados na sequência -
elemento
<y>
pode aparecer 0-1 tempo na sequência -
locais
<x>
e<y>
pode estar em qualquer lugar -. Ou seja, é possível ter momentos não ligados ao elemento<x>
e, em seguida, um único elemento<y>
, e tempos depois não ligados ao elemento<x>
exemplos XML deste problema:
Exemplo # 1
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
Exemplo # 2
<y>stuff</y>
<x>stuff</x>
<x>stuff</x>
Exemplo # 3
<x>stuff</x>
<x>stuff</x>
<y>stuff</y>
<x>stuff</x>
Obrigado!
Solução
Por várias razões, nenhum dos Yuval de, Mo ou amostras de trabalho de davidsheldon. Aqui está um que faz.
<xs:complexType name="myComplexType">
<xs:sequence>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:sequence minOccurs="0">
<xs:element name="y" type="xs:string"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:sequence>
</xs:complexType>
Outras dicas
EDIT: Como Alohci mencionado, a minha solução é incorreta. De acordo com a especificação, um elemento em xs: all só pode aparecer zero ou uma vez. Desculpe por qualquer inconveniente
Eu acho que o que você quer não é uma sequência. Uma sequência define não apenas os elementos, mas também a fim. E no seu caso a ordem pode mudar. Já experimentou xs: Todas
<xs:complexType name="myComplexType">
<xs:all>
<xs:element name="x" type="xs:string" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" maxOccurs="1"/>
</xs:all>
</xs:complexType>
Outra appraoch poderia ser a de torná-lo uma sequência, mas marcar a seqüência de ser maxOccurs="unbounded"
Tem sido um tempo desde que eu usei esquema, mas acho que sequências são aqui a sua resposta.
Você precisa ter um número ilimitado de opções entre (um x), ou (a y seguido por um x).
<xsd:element name="parent">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="x" type="xs:string"/>
<xsd:sequence>
<xsd:element name="y" type="xsd:string" />
<xsd:element name="x" type="xsd:string" />
</xsd:sequence>
</xsd:choice>
</xsd:complexType>
</xsd:element>
Não é muito complicado. Em cima da minha cabeça, deve ser algo como isto:
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="y" type="xs:string" minOccurs="0" maxOccurs="1"/>
<xs:element name="x" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
Uma vez que cada elemento no XSD é opcional por padrão, este XSD irá corresponder a estrutura XML que você definiu, com o elemento y
aparecendo em qualquer lugar antes, depois ou entre os elementos x
, com uma ocorrência máximo de 1