Python初学者需要帮助过滤.xml文件。我一直在尝试使用xml.etree.ElementTree,但收效甚微。
xml看起来像这样:
<ClientData>
<Report>
<ReportHost>
<ReportItem pluginID="11111">
Ipsum lorem etc leviosa!
</ReportItem>
</ReportHost>
<ReportHost>
<ReportItem pluginID="22222">
Sed ut perspiciatis unde omnis iste
</ReportItem>
</ReportHost>
</Report>
</ClientData>
如果ReportItem.pluginID与黑名单上的项目匹配,我想删除整个元素(ReportItem)及其子项,然后编写过滤后的.xml。谢谢!
编辑 - 这是我迄今为止所拥有的内容,但我不确定如何使用这种级别的嵌套:
from xml.etree.ElementTree import ElementTree
tree = ElementTree()
# Test input
tree.parse("test.xml")
for node in tree.findall('ReportItem'):
if tag.attrib['pluginID']=='11111':
tree.remove(node)
tree.write('test_out.xml')
答案 0 :(得分:1)
我真的建议使用lxml模块。使用Python的xml模块时,没有对父元素的引用。我认为使用lxml会更容易。
答案 1 :(得分:1)
这是我最终开发的内容。我发现它有内存问题,过滤大于600MB的文件,可能更小。从我读过的内容来看,有很多方法可以比解析整个xml更好地处理内存,但我没有时间进行测试。
import lxml.etree as le
import os
from optparse import OptionParser, SUPPRESS_HELP
def removeVulns(filename, pluginlist):
output_file = open("temp.xml","wb")
with open(filename,'r') as f:
doc=le.parse(f)
for nessusID in open(pluginlist):
for elem in doc.xpath('//*[attribute::pluginID]'):
if elem.attrib['pluginID']==nessusID.strip('\n'):
parent=elem.getparent()
parent.remove(elem)
output_file.write(le.tostring(doc))
f.close()
output_file.close()
os.remove(filename)
os.rename('temp.xml', filename)
def main():
parser = OptionParser(usage='%prog -f <filename>',
version='%prog 1.0')
parser.add_option('-f',
dest='name',
type='string',
help='.nessus name')
(options, args) = parser.parse_args()
if not options.name:
parser.error('Pop, you forgot name!')
removeVulns(options.name, 'pluginlist.txt')
if __name__ == "__main__":
main()