从 Python 中的 XSD 文件中提取带有文档的枚举
Extract enumerations with documentation from XSD file in Python
我正在尝试编写一个函数来从 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")
我的功能可能 return“自己的中心”
我正在使用 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
我正在尝试编写一个函数来从 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")
我的功能可能 return“自己的中心”
我正在使用 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