Voici une XSD - est-ce que sa grammaire est la plus claire?
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="object">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="string">
<xs:complexType>
<xs:attribute name="name" type="xs:string"/>
<xs:attribute name="value" type="xs:string"/>
</xs:complexType>
</xs:element>
<xs:element ref="object"/>
</xs:choice>
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
L'idée de base du XML est des objets imbriqués:
V --> string | O // a Value is a string or an Object
O --> (K V)* // an Object is list of named values (Key-Value pairs)
Mais il est un peu différent, en ce que la racine est toujours un objet (pas une chaîne), et il est lui-même nommé (même qu'il ne soit pas dans un autre objet):
O ==> (string K | O)* K
Je suis ouvert à changer le format lui-même légèrement, pour donner XML différent, si cela fera une XSD plus simple/plus claire. Si un objet a toujours un nom, cela supprime les cas spéciaux, ce qui rend la grammaire et le XSD plus réguliers - et plus simples. Par conséquent, il semble plus simple pour un objet d'avoir toujours un nom.
Clarification: le cas particulier serait que lorsque l'objet est la racine, il n'est pas nommé, mais dans tous les autres cas, il est nommé. Cela nécessite une section d'en-tête supplémentaire, comme ceci:
O'==> (string K | O)*
O ==> (string K | O)* K
La manipulation de ce cas particulier est plus complexe que l'original, même si refactorisé pour minimiser cette complexité:
F ==> (string K | O)*
O ==> F K
ne me dérangeait désimbrication la chaîne parce que je voulais faire correspondre la production unique, mais vous avez raison. Cela fait une plus grande différence que je ne l'avais prévu, parce que cela désencombre l'objet, le rendant plus précis et plus clair.Mais je voulais savoir s'il y a des approches différentes qui sont plus simples - comme l'utilisation de types, de groupes ou de choses auxquelles je n'avais pas pensé. Je vais essayer de clarifier la question. – 13ren
Rendre optionnel le nom de l'objet ne fait pas de distinction entre quand l'objet est la racine et quand il se trouve dans un autre objet. Ce dernier a toujours besoin d'un nom. C'est le cas particulier - je ne l'ai pas rendu explicite dans la question; J'ai maintenant clarifié. – 13ren