如何在针对XSD的验证期间填充XML中的默认值?如果我的属性未定义为use="require"
并且具有default="1"
,则可以将这些默认值从XSD填充到XML。
实施例: 原始XML:
<a>
<b/>
<b c="2"/>
</a>
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>
我想使用XSD验证原始XML并填充所有默认值:
<a>
<b c="1"/>
<b c="2"/>
</a>
如何在Python中获取它? 通过验证没有问题(例如XMLSchema)。问题是默认值。
答案 0 :(得分:3)
要跟进我的评论,这里有一些代码
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
会给你
<a>
<b c="1"/>
<b c="2"/>
</a>
我稍微修改了你的XSD,在xs:attribute
中包装xs:complexType
并添加了模式名称空间。要填写默认值,您需要将attribute_defaults=True
传递给etree.XMLParser()
,它应该有效。