从Python中的XSD文件中提取带有文档的枚举



我正试图编写一个函数来从XSD文件中获取一些值的描述,其结构类似于以下

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="File">
<xs:annotation>
<xs:documentation>List of centers</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="Register">
<xs:annotation>
<xs:documentation>Center list registers</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name="CenterType">
<xs:annotation>
<xs:documentation>Type of center  </xs:documentation>
</xs:annotation>
<xs:simpleType>
<xs:restriction base="xs:int">
<xs:totalDigits value="1"/>
<xs:enumeration value="1">
<xs:annotation>
<xs:documentation>Own center</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="2">
<xs:annotation>
<xs:documentation>External center</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="3">
<xs:annotation>
<xs:documentation>Associated center</xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="4">
<xs:annotation>
<xs:documentation>Other</xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

举个例子,如果我把

get_value("CenterType", "1")

我的函数可能返回";自有中心";

我使用的是Python 3.8和XMLSchema。

我写了这个片段,我可以打印所有元素的标签

xsd_xml = xmlschema.XMLSchema(xsd_file)     
fichero = xsd_xml.elements["File"][0]

for elem in fichero:
print(elem.tag)

但我需要访问枚举和文档字段。如何提取这些数据?

使用解开

import untangle
xsd_file = "C:\code\python\xsd\test.xsd"
obj = untangle.parse(xsd_file)
res = obj.xs_schema.xs_element.xs_complexType.xs_sequence.xs_element.xs_complexType.xs_sequence.xs_element.xs_simpleType.xs_restriction.xs_enumeration

最后,我使用LXML和XMLSchema命名空间解决了我的问题

def get_value(self, field: str, code: str, file: str):

desc = ""

xsd_xml = ET.parse(file)
search_elem = f".//{{http://www.w3.org/2001/XMLSchema}}element[@name='{field}']"
element = xsd_xml.find(search_elem)

search_enum = f".//{{http://www.w3.org/2001/XMLSchema}}enumeration[@value='{code}']"
enumeration = element.find(search_enum)

if enumeration is not None:
documentation = enumeration.find(".//{http://www.w3.org/2001/XMLSchema}documentation")
desc = documentation.text
else:
desc = "N/A"

return desc

最新更新