2010-06-10 2 views
3

Comment remplir la valeur par défaut dans mon XML lors de la validation contre XSD? Si mon attribut n'est pas défini comme use="require" et a default="1", il peut être possible de remplir ces valeurs par défaut du fichier XSD au format XML.Validation et remplissage des valeurs par défaut en XML basé sur XSD en Python

Exemple: XML d'origine:

<a> 
<b/> 
<b c="2"/> 
</a> 

schéma XSD:

<xs:element name="a"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="b" maxOccurs="unbounded"> 
    <xs:attribute name="c" default="1"/> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 

Je veux valider le XML original en utilisant XSD et remplir toutes les valeurs par défaut:

<a> 
<b c="1"/> 
<b c="2"/> 
</a> 

Comment l'obtenir en Python? Avec la validation, il n'y a pas de problème (par exemple, XMLSchema). Le problème sont les valeurs par défaut.

+0

Je viens de poser une question similaire à voir si cela est pris en charge dans une bibliothèque de validation de toute langue http://stackoverflow.com/questions/4900867/is-there-a-xml-schema-validation-library- that-supports-the-default-attribute-valu –

+0

Je ne l'ai pas fait auparavant, cependant, à partir de [documentation lxml] (http://lxml.de/validation.html#validation-at-parse-time) il semble comme il va «tisser» les valeurs par défaut dans le document. –

Répondre

3

Pour donner suite à mon commentaire, voici un code

from lxml import etree 
from lxml.html import parse 

schema_root = etree.XML('''\ 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
<xs:element name="a"> 
<xs:complexType> 
    <xs:sequence> 
    <xs:element name="b" maxOccurs="unbounded"> 
    <xs:complexType> 
    <xs:attribute name="c" default="1" type="xs:string"/> 
    </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 
</xs:element> 
</xs:schema>''') 

xmls = '''<a> 
<b/> 
<b c="2"/> 
</a>''' 

schema = etree.XMLSchema(schema_root) 
parser = etree.XMLParser(schema = schema, attribute_defaults = True) 

root = etree.fromstring(xmls, parser) 
result = etree.tostring(root, pretty_print=True, method="xml") 

print result 

vous donnera

<a> 
<b c="1"/> 
<b c="2"/> 
</a> 

J'ai modifié votre XSD légèrement, enveloppé dans xs:attributexs:complexType et a ajouté l'espace de noms de schéma. Pour que vos paramètres par défaut soient remplis, vous devez passer le attribute_defaults=True au etree.XMLParser() et cela devrait fonctionner.

+0

Et pourquoi faut-il insérer xs: attribute dans xs: complexType? – PoltoS

+0

Peut-être savez-vous comment répondre à cette question: http://stackoverflow.com/questions/4799838/is-it-possible-to-get-the-type-of-an-xml-node-as-it- was-defined-in-xsd – PoltoS

Questions connexes