【发布时间】:2022-07-01 19:15:01
【问题描述】:
从使用 xmlschema 包的 XML Schema 中,我提取了如下所示的 XsdEnumerationFacets
XsdEnumerationFacets(['OP1', 'OP2', 'OP3', 'OP3', 'OP4', ...])
如何从中提取可能的值? (在本例中为“OP1”、“OP2”、“OP3”、“OP3”、“OP4”等)。
我有一个想法,将其转换为字符串(str(enum)),并解析它,但如果它很长,则不包括最后的元素。
(我有 xmlschema==1.9.2 和 Python 3.9。)
例子:
schema.xsd是
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.java2s.com" xmlns="http://www.java2s.com"
elementFormDefault="qualified">
<xs:element name = "Tshirt">
<xs:complexType>
<xs:sequence>
<xs:element name = "Color" type = "clothesColorType" />
<xs:element name = "Size" type = "clothesSizeType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:simpleType name="clothesSizeType">
<xs:restriction base="xs:string">
<xs:enumeration value="S" />
<xs:enumeration value="M" />
<xs:enumeration value="L" />
<xs:enumeration value="XL" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="clothesColorType">
<xs:restriction base="xs:string">
<xs:enumeration value="Black" />
<xs:enumeration value="White" />
<xs:enumeration value="Green" />
<xs:enumeration value="Blue" />
</xs:restriction>
</xs:simpleType>
</xs:schema>
我的代码:
import xmlschema
schema = xmlschema.XMLSchema("schema.xsd")
tshirt = schema.elements["Tshirt"]
enumerate_values = {}
for c in tshirt.type.content:
for comp in c.type.iter_components():
if isinstance(comp, xmlschema.validators.XsdEnumerationFacets):
enumerate_values[c.name.split("}")[1]] = str(comp)
print(enumerate_values)
这为我创建了字典:
{'Color': "XsdEnumerationFacets(['Black', 'White', 'Green', 'Blue'])", 'Size': "XsdEnumerationFacets(['S', 'M', 'L', 'XL'])"}
我想要['Black', 'White', 'Green', 'Blue'],而不是"XsdEnumerationFacets(['Black', 'White', 'Green', 'Blue'])"。而且我不想解析这个字符串。正如我提到的更长的值列表,最后一个元素被省略号 (...) 替换,因此解析字符串会给我一个错误或部分结果。
【问题讨论】:
标签: python xsd python-xmlschema