3

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')
4

2 回答 2

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()
于 2016-04-01T02:58:16.050 回答
1

我真的建议使用 lxml 模块。使用 Python 的 xml 模块时没有对父元素的引用。我认为使用 lxml 会更轻松。

于 2016-03-31T19:15:58.000 回答