如何统计目录XML文件mpeg7text:Keyword元素指定词出现次数并解决XPath命名空间报错
错误原因
- 你在XPath表达式中使用了
mpeg7text命名空间前缀,但没有向lxml的xpath方法传入前缀对应的命名空间映射,导致解析器无法识别该前缀 - XPath中匹配文本的目标单词没有加引号,会被解析器识别为节点名称而非字符串常量,无法正确匹配内容
- 原有代码未做计数累加,也没有接收xpath返回的统计结果,无法得到最终总次数
修复方案
首先打开你任意一个XML文件,在根节点的属性中找到xmlns:mpeg7text="xxx"对应的xxx值(也就是mpeg7text的命名空间URI),填入下方代码的namespaces字典中,常见的mpeg7 text命名空间URI为http://www.mpeg7.org/2001/MPEG7/Text,如果和你的文件不一致替换即可。
完整可运行代码
import os import lxml.etree as et # 配置项 XML_FOLDER = "替换为你的XML文件夹路径" TARGET_WORD = "Impfstoff" # 要统计的目标单词 # 命名空间映射,key是xpath里用的前缀,value是xml里对应的命名空间URI NAMESPACES = { "mpeg7text": "http://www.mpeg7.org/2001/MPEG7/Text" # 替换为你XML里的实际值 } total_count = 0 for filename in os.listdir(XML_FOLDER): if not filename.endswith('.xml'): continue full_path = os.path.join(XML_FOLDER, filename) tree = et.parse(full_path) # 传入命名空间映射,字符串变量用f-string拼接,注意加单引号包裹 current_count = tree.xpath( f"count(.//mpeg7text:Keyword/mpeg7text:Keyword[.='{TARGET_WORD}'])", namespaces=NAMESPACES ) total_count += int(current_count) print(f"单词{TARGET_WORD}总出现次数:{total_count}")
注意事项
- 如果要统计多个单词,可以把TARGET_WORD改成列表循环统计即可
- 如果XML文件的编码特殊,解析时可以添加
et.parse(full_path, parser=et.XMLParser(encoding='utf-8'))指定编码避免乱码
内容的提问来源于stack exchange,提问作者kathi94
相关产品推荐
相关产品推荐

