解析XML文件,实现按指定配置筛选项目可用文件的功能
解决XML文件中按配置筛选可用文件的问题
你已经成功获取到所有文件了,接下来只需要给每个文件添加「是否被当前配置排除」的判断逻辑,就能实现需求啦。咱们一步步来修改代码:
核心思路
根据你的描述,规则很清晰:
- 每个文件默认适用于所有配置
- 如果文件节点下存在
<excluded>标签,且该标签内包含当前配置名称,那么这个文件就需要被排除
修改后的完整代码
from lxml import etree def getSourceFile(sTree, szConfigName): lSource = [] # 获取所有<file>节点 files = sTree.xpath('/group/file') for file_node in files: # 获取文件名 name_element = file_node.find('name') if not name_element: continue # 跳过没有name的异常节点 file_name = name_element.text # 检查是否存在excluded节点 excluded_node = file_node.find('excluded') if excluded_node is None: # 没有excluded,默认加入列表 lSource.append(file_name) continue # 获取所有被排除的配置 excluded_configs = [config.text for config in excluded_node.findall('configuration')] # 如果当前配置不在排除列表中,就加入结果 if szConfigName not in excluded_configs: lSource.append(file_name) print(f"配置 {szConfigName} 下的可用文件: {lSource}") return lSource if __name__ == '__main__': sTree = etree.parse("myXmlFile.xml") lConfigName = ["Configuration1", "Configuration2", "Configuration3", "Configuration4"] for config in lConfigName: getSourceFile(sTree, config)
关键代码解释
- 简化节点查找:直接用
xpath('/group/file')一次性获取所有文件节点,比嵌套循环更简洁高效 - 文件名获取:用
file_node.find('name')精准定位每个文件的名称节点,避免遍历所有子节点的冗余操作 - 排除逻辑判断:
- 先检查当前文件是否有
<excluded>节点,没有就直接加入结果列表(符合默认规则) - 如果存在
<excluded>节点,提取所有<configuration>的文本内容组成排除配置列表 - 判断当前配置是否不在排除列表中,满足条件才将文件名加入结果
- 先检查当前文件是否有
预期输出结果
运行代码后,你会看到符合规则的输出:
配置 Configuration1 下的可用文件: ['Path\\File1.c', 'Path\\File3.c', 'Path\\File4.c'] 配置 Configuration2 下的可用文件: ['Path\\File1.c', 'Path\\File4.c'] 配置 Configuration3 下的可用文件: ['Path\\File1.c', 'Path\\File2.c', 'Path\\File4.c'] 配置 Configuration4 下的可用文件: ['Path\\File1.c', 'Path\\File2.c', 'Path\\File3.c', 'Path\\File4.c']
这个结果完全匹配你描述的筛选规则,可以直接测试使用~
内容的提问来源于stack exchange,提问作者Asmature
相关产品推荐
相关产品推荐

