如何用Python统计XML指定元素数量?我的代码为何无法计数?
如何解决Python统计XML指定元素数量的问题
嘿,我来帮你排查下代码里的问题~你想统计第一个<AAA>节点下的<BBB>数量,但代码没报错却没输出结果,主要是这几个小逻辑错误导致的:
问题拆解
错误1:遍历对象搞错了
root.findall('AAA')[a](这里a=0)已经是第一个<AAA>节点了,但你用for AAA in root.findall('AAA')[a]是在遍历这个<AAA>的子元素(也就是里面的三个<CCC>)。这时候循环里的AAA其实是<CCC>元素,再调用AAA.findall('CCC')自然找不到任何内容,内层循环根本不会执行,统计逻辑完全没跑起来。错误2:不存在的
count()方法
XML Element对象并没有count()这个方法,你想统计数量的话,需要自己初始化一个计数器,每找到一个<BBB>就累加1。另外你的count变量也没有提前初始化,就算前面逻辑对了,这里也会报错(只不过因为内层循环没执行,所以没触发错误)。
修正后的基础代码
假设你用的是Python标准库xml.etree.ElementTree,下面是修正后的完整代码:
import xml.etree.ElementTree as ET # 你的XML内容(也可以从文件读取:tree = ET.parse('your_file.xml'); root = tree.getroot()) xml_content = """<data> <AAA> <CCC> <BBB>This</BBB> </CCC> <CCC> <BBB>is</BBB> </CCC> <CCC> <BBB>test1</BBB> </CCC> </AAA> <AAA> <CCC> <BBB>This is test</BBB> </CCC> </AAA> <AAA> <CCC> <BBB>222222</BBB> </CCC> <CCC> <BBB>333333</BBB> </CCC> </AAA> </data>""" root = ET.fromstring(xml_content) count = 0 # 获取第一个AAA节点 first_aaa = root.findall('AAA')[0] # 遍历该AAA下的所有CCC节点 for ccc in first_aaa.findall('CCC'): # 遍历CCC下的BBB节点(每个CCC只有一个BBB,也可以简化为 if ccc.find('BBB'): count +=1) for bbb in ccc.findall('BBB'): count += 1 print(count) # 输出:3,符合预期
更简洁的XPath写法
其实可以直接用XPath表达式定位目标元素,省去多层循环,代码更简洁高效:
import xml.etree.ElementTree as ET xml_content = """[你的XML内容,同上]""" root = ET.fromstring(xml_content) # XPath含义:根节点下的第一个AAA -> 所有CCC -> 所有BBB,取长度就是数量 bbb_count = len(root.findall('./AAA[1]/CCC/BBB')) print(bbb_count) # 输出:3
这里的./AAA[1]表示根节点(<data>)下的第一个<AAA>元素,/CCC/BBB表示该AAA下所有嵌套在CCC里的BBB元素,len()直接获取元素列表的长度,就是你要的统计数。
内容的提问来源于stack exchange,提问作者Cho
相关产品推荐
相关产品推荐

