如何用Python ElemTree从XSD提取实体及属性的名称与类型?
用ElementTree提取XSD中的实体与属性信息
首先得处理XSD的命名空间问题,ElementTree需要明确指定命名空间才能用XPath精准定位节点。假设你的XSD用的是标准XSD命名空间(http://www.w3.org/2001/XMLSchema,对应xsd前缀),可以按以下步骤操作:
步骤1:加载XSD并配置命名空间映射
import xml.etree.ElementTree as ET # 加载你的XSD文件 tree = ET.parse('your_schema_file.xsd') root = tree.getroot() # 定义命名空间映射,解决xsd前缀的识别问题 namespaces = {'xsd': 'http://www.w3.org/2001/XMLSchema'}
步骤2:提取复杂类型实体及下属属性
遍历所有xsd:complexType节点获取实体名称,再递归提取其下所有xsd:element的名称和类型(包括嵌套在子复杂类型里的元素):
def get_all_elements(elem): """递归提取节点下所有xsd:element的name和type""" elem_list = [] # 匹配当前节点及所有子节点中的xsd:element for element in elem.findall('.//xsd:element', namespaces): elem_name = element.get('name') elem_type = element.get('type') if elem_name: elem_list.append({ 'name': elem_name, 'type': elem_type if elem_type else '嵌套复杂类型' }) return elem_list # 遍历所有复杂类型实体 for complex_type in root.findall('.//xsd:complexType', namespaces): entity_name = complex_type.get('name') if not entity_name: continue print(f"实体名称: {entity_name}") # 提取该实体下的所有属性元素 elements = get_all_elements(complex_type) for item in elements: print(f" 属性名称: {item['name']}, 类型: {item['type']}") print('---')
针对你提供的XSD示例,运行后输出如下:
实体名称: EntityX_t 属性名称: xyz, 类型: xxx:Entityx_t 属性名称: subElement, 类型: 嵌套复杂类型 属性名称: subelement, 类型: SubElement_t 属性名称: elementRelationships, 类型: xxx:ElementRelationships_t 属性名称: notesSection, 类型: xxx:NotesSection_t 属性名称: extension, 类型: abcExtension_t ---
关键细节说明
- 用
.//xsd:complexTypeXPath可以全局精准定位所有复杂类型实体,避免遍历无关标签。 - 递归函数能处理嵌套结构,比如示例中
subElement内部的子元素也能被提取。 - 对于带自定义前缀的类型(如
xxx:Entityx_t),直接提取type属性值即可,后续可根据需求拆分前缀和类型名。
内容的提问来源于stack exchange,提问作者L4zl0w
相关产品推荐
相关产品推荐

