Je travaille avec un document XML où une balise doit avoir un ensemble d'attributs ou un autre. Par exemple, il doit ressembler à <tag foo="hello" bar="kitty" />
ou <tag spam="goodbye" eggs="world" />
par exemple.Comment puis-je exiger qu'un élément possède un ensemble d'attributs ou un autre dans un schéma XSD?
<root>
<tag foo="hello" bar="kitty" />
<tag spam="goodbye" eggs="world" />
</root>
J'ai donc un schéma XSD où j'utilise l'élément xs:choice
de choisir entre deux groupes d'attributs différents:
<xsi:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="tag">
<xs:choice>
<xs:complexType>
<xs:attribute name="foo" type="xs:string" use="required" />
<xs:attribute name="bar" type="xs:string" use="required" />
</xs:complexType>
<xs:complexType>
<xs:attribute name="spam" type="xs:string" use="required" />
<xs:attribute name="eggs" type="xs:string" use="required" />
</xs:complexType>
</xs:choice>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xsi:schema>
Cependant, lors de l'utilisation lxml pour tenter de charger ce schéma, je reçois les éléments suivants erreur:
>>> from lxml import etree
>>> etree.XMLSchema(etree.parse("schema_choice.xsd"))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "xmlschema.pxi", line 85, in lxml.etree.XMLSchema.__init__ (src/lxml/lxml.etree.c:118685)
lxml.etree.XMLSchemaParseError: Element '{http://www.w3.org/2001/XMLSchema}element': The content is not valid. Expected is (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*))., line 7
Puisque l'erreur est la mise en place de mon élément xs:choice
, je l'ai essayé de mettre dans des endroits différents, mais peu importe ce que j'essaie, je ne peux pas sembler l'utiliser pour définir une étiquette pour avoir un ensemble d'attributs (foo
et bar
) ou un autre (spam
et eggs
).
Est-ce encore possible? Et si oui, alors quelle est la syntaxe correcte?
En effet. Je suggère fortement d'utiliser RELAX NG pour tout type de validation XML, sauf si vous en avez besoin pour quelque chose d'autre qui commande XML Schema (XSLT, XQuery, WS- * etc). En fait, lxml peut gérer RELAX NG en Python - voir http://stackoverflow.com/questions/1254919/how-do-i-validate-xml-document-via-relax-ng-schema-in-python –
Pouvez-vous Liez-moi quelque document quelque part qui le confirme? –
@Pavel: Merci pour le conseil, je vais certainement considérer cela lors de l'écriture de mes propres schémas dans le futur; Malheureusement pour le moment, je ne fais que déboguer un schéma invalide écrit par quelqu'un d'une autre compagnie, donc je suis coincé avec XSD. –