【问题标题】:Extracting enumeration values from an XML Schema with Python使用 Python 从 XML 模式中提取枚举值
【发布时间】: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


    【解决方案1】:

    我创建了 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']}
    

    【讨论】:

    • 我不接受我自己的答案,因为我不应该使用“私有”数据属性 (_elements)。我希望会有更好的答案,不使用实现细节。
    【解决方案2】:
    
        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.local_name] = [x.get("value") for x in comp]
        
        print(enumerate_values)
    
    

    返回: {'Color': ['Black', 'White', 'Green', 'Blue'], 'Size': ['S', 'M', 'L', 'XL']}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 2022-07-07
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多