在Python中基于XSD验证和填充XML中的默认值

在针对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).问题是默认值.

解决方法:

为了跟进我的评论,这里有一些代码

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(),它应该可以工作.

上一篇:春季初始化期间如何避免从Internet下载架构文件


下一篇:友链