基于PySpark使用XSD生成嵌套XML全路径元素名方案咨询
基于Python的XSD元素全路径提取方案
你可以直接使用Python的xmlschema库实现需求,它原生支持解析嵌套复杂类型、跨XSD引用等场景,无需手动处理XSD结构,可自动生成元素路径列表,完美适配XSD每年更新的自动化需求。
第一步:安装依赖
pip install xmlschema
第二步:实现代码
import xmlschema def traverse_element(element, current_path, result_list): # 拼接当前层路径 new_path = f"{current_path}_{element.name}" if current_path else element.name type_local_name = element.type.name.local_name if hasattr(element.type.name, 'local_name') else str(element.type.name) # 简单类型直接输出路径,复杂类型递归遍历子元素 if type_local_name.startswith("Simple_"): result_list.append(new_path) else: if hasattr(element.type, 'content') and element.type.content: # 可在此处加逻辑跳过数组包装层:比如当前类型只有1个子元素且maxOccurs为unbounded,就跳过当前层路径拼接 for child in element.type.content.iter_elements(): traverse_element(child, new_path, result_list) if __name__ == "__main__": # 加载业务XSD,xmlschema会自动解析导入的基础XSD xs = xmlschema.XMLSchema("你的业务XSD文件路径,比如type1.xsd") result = [] # 从根结构下的子元素开始遍历,跳过不需要的根元素前缀 root_content = xs.elements['Message'].type.content for child in root_content.iter_elements(): traverse_element(child, "", result) # 打印结果 for path in result: print(path) # 写入文本文件供后续使用 with open("element_paths.txt", "w", encoding="utf-8") as f: f.write("\n".join(result))
输出说明
运行上述代码得到的输出和你要求的格式完全匹配,如果你需要省略AssignedProducts这类数组包装层的路径,只需在递归逻辑中增加判断:如果当前复杂类型只有1个子元素且子元素的maxOccurs为unbounded,就跳过当前层的名称拼接,直接遍历子元素即可适配你的命名规则。
内容的提问来源于stack exchange,提问作者Ronald Hensbergen
相关产品推荐
相关产品推荐

