To follow my comment, here is the 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/> <bc="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
will provide you
<a> <bc="1"/> <bc="2"/> </a>
I changed your XSD a bit, wrapped xs:attribute in xs:complexType and added a schema namespace. To fill in your default values, you need to pass attribute_defaults=True to etree.XMLParser() and it should work.
source share