Python XML文件搜索函数失效:硬编码正常转函数后无输出
问题排查与修复
执行方式错误
你用python xmlsearch.py("burningf")调用脚本是完全错误的,Python脚本不支持这种传参方式。下面是两种正确的调用方法:
方法1:在脚本内直接调用函数
在脚本的最后添加以下代码,然后运行python xmlsearch.py:
if __name__ == "__main__": xmlsearch("burningf")
方法2:通过命令行参数传值
修改脚本,让它支持从命令行接收搜索词,这样可以灵活查询不同游戏:
import xml.etree.ElementTree as ET import sys def xmlsearch(search_query): tree = ET.parse('gamelist.xml') root = tree.getroot() elements = root.findall(".//machine[@name='" + search_query + "']") for element in elements: name = element.get('name') desc = element.find('description').text year = element.find('year').text manf = element.find('manufacturer').text print(f"Name: {name}, Description: {desc}, Year: {year}, Manufacturer: {manf}") if __name__ == "__main__": if len(sys.argv) != 2: print("用法:python xmlsearch.py <游戏名称>") sys.exit(1) xmlsearch(sys.argv[1])
之后执行python xmlsearch.py burningf就能得到结果。
函数内部的逻辑缺陷
- 无匹配时会报错:如果搜索不到对应游戏,循环不会执行,
name、desc等变量未定义,最后一行的print会直接抛出NameError。 - 只输出最后一个匹配项:原代码的
print在循环外面,就算找到多个结果,也只会打印最后一个的信息。
修复后的函数:
def xmlsearch(search_query): tree = ET.parse('gamelist.xml') root = tree.getroot() elements = root.findall(".//machine[@name='" + search_query + "']") if not elements: print(f"未找到名称为'{search_query}'的游戏") return for element in elements: name = element.get('name') desc = element.find('description').text year = element.find('year').text manf = element.find('manufacturer').text print(f"Name: {name}, Description: {desc}, Year: {year}, Manufacturer: {manf}")
额外的安全优化
原代码用字符串拼接构造XPath查询,如果搜索词里包含单引号,会直接导致XPath语法错误。可以改用更安全的写法:
# 转义搜索词中的单引号 safe_query = search_query.replace("'", "\\'") elements = root.findall(".//machine[@name='{}']".format(safe_query)) # 或者使用参数化查询(Python 3.8及以上版本支持) elements = root.findall(".//machine[@name=$query]", {"query": search_query})
内容的提问来源于stack exchange,提问作者JackDebian
相关产品推荐
相关产品推荐

