0

从使用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'])"}

而不是"XsdEnumerationFacets(['Black', 'White', 'Green', 'Blue'])"作为一个价值,我想拥有 ['Black', 'White', 'Green', 'Blue']. 而且我不想解析这个字符串。正如我提到的更长的值列表,最后一个元素被省略号 ( ...) 替换,因此解析字符串会给我一个错误或部分结果。

4

1 回答 1

0

我创建了 get_enum_values 函数来从 XsdEnumerationFacets 对象中获取值。这是整个代码,适用于问题中的 xsd 文件。

import xmlschema

schema = xmlschema.XMLSchema("schema.xsd")
tshirt = schema.elements["Tshirt"]

def get_enum_values(enum):
    """Get values from XsdEnumerationFacets"""
    return [e.items()[0][1] for e in  enum._elements]

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]] = get_enum_values(comp)  # Changed

print(enumerate_values)

这给了我我想要的:

{'Color': ['Black', 'White', 'Green', 'Blue'], 'Size': ['S', 'M', 'L', 'XL']}
于 2022-01-19T10:55:22.960 回答