我正在尝试解析一个大的xml文件以供审核。因为这与我组织的防火墙有关,我无法发布实际的XML。第一个for语句定位我的所有设备组。第二个for语句获取该设备组中的所有安全规则。第三个for语句用于查看是否设置了日志转发。
这个特殊的例子只是循环运行。我尝试过其他可以打印设备组名称,安全规则和日志转发文本的故障排除。我似乎无法在if else语句中正确使用它,它似乎为每个安全规则打印多行。
对不起家伙/女孩,几乎是一个蟒蛇菜鸟。我相信这对你们中的某些人来说并不是一件难事。
import xml.etree.ElementTree as ET
tree = ET.parse('/testing/bigtest.xml')
root = tree.getroot()
for devicegroupname in root.findall('./devices/entry/device-group/entry'):
dgname = devicegroupname.get('name')
for securityrule in root.findall('./devices/entry/device-group/entry/post-rulebase/security/rules/entry'):
rulename = securityrule.get('name')
for logsetting in root.findall('./devices/entry/devicegroup/entry/post-rulebase/security/rules/entry/log-setting'):
logenabled = logsetting.text
if logenabled in ('log-forwarding-main'):
break
else:
print dgname + " " + rulename + " " + logenabled
break
答案 0 :(得分:1)
如果没有看到XML,很难知道,但我有一个猜测。
你有一个循环,每个entry
:
for securityrule in root.findall('./devices/entry/device-group/entry/post-rulebase/security/rules/entry'):
然后你有一个循环,可以在任何条目中获取每个log-setting
,在树中的任何位置:
for logsetting in root.findall('./devices/entry/devicegroup/entry/post-rulebase/security/rules/entry/log-setting'):
因此,对于条目0,您将重复所有200个条目的日志设置,然后再次对条目1的所有200个条目进行日志设置,依此类推。
我很确定您只想查看当前条目的日志设置。像这样:
for logsetting in security rule.findall('./log-setting'):
在所有其他级别也是如此。
作为旁注,我不确定这是做什么的:
if logenabled in ('log-forwarding-main'):
......但它可能没有这样做。 ('log-forwarding-main')
不是一个字符串的元组,它只是一个字符串。逗号制作元组,而不是括号,你没有任何逗号。所以,它与if logenabled in 'log-forwarding-main'
相同。这是在询问字符串logenabled
是'log-forwarding-main'
的子字符串,如'log'
还是'g-fo'
,我怀疑它是否有用。