如何通过XSD属性字段获取标签层级路径并解决重复输出问题
问题原因
你的代码出现重复路径的核心问题是find_all('xs:element')默认会递归查找当前节点下所有层级的xs:element标签,也就是说根节点调用该方法时,会同时返回owner_id、legal_person、snow_clean_area三个元素,导致嵌套的legal_person被当成顶层元素重复处理,才会多出"legal_person"这条无效路径。
另外你代码里的路径拼接顺序是反的,当前实现会得到legal_person;owner_id的逆序路径,和你预期的顺序不符。
修复方案
调用find_all时添加recursive=False参数,只查找当前节点的直接子xs:element,避免跨层级抓取元素,同时调整路径拼接顺序即可。
修复后代码如下:
def recursive(xml, parent_path=None): # 只找当前节点的直接子xs:element,不递归更深层级 child_elements = xml.find_all('xs:element', recursive=False) for elem in child_elements: # 拼接当前路径 if parent_path: current_path = f"{parent_path};{elem['name']}" else: current_path = elem['name'] # 检查当前元素下还有没有子xs:element has_child = elem.find_all('xs:element', recursive=False) if has_child: # 有子元素,继续递归 yield from recursive(elem, current_path) else: # 没有子元素,输出最终路径 yield current_path
调用示例
假设你已经用BeautifulSoup加载了XSD内容,调用方式如下:
from bs4 import BeautifulSoup # 加载你的XSD文件内容 with open('test.xsd', 'r', encoding='utf-8') as f: xsd_content = f.read() soup = BeautifulSoup(xsd_content, 'lxml-xml') # 调用递归函数获取所有路径 for path in recursive(soup): print(f'"{path}"')
输出结果
"owner_id;legal_person" "snow_clean_area"
完全符合预期要求,更深层级的嵌套也会自动拼接所有上层节点名。
内容的提问来源于stack exchange,提问作者magicarm22
相关产品推荐
相关产品推荐

