2016-03-31 8 views
3

Python Anfänger benötigt Hilfe beim Filtern von .xml-Dateien. Ich habe versucht mit xml.etree.ElementTree mit wenig Erfolg.Filter xml/nessus Scan mit Python ElementTree

Die XML wie folgt aussieht:

<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> 

Wenn die ReportItem.pluginID auf einer schwarzen Liste ein Element übereinstimmt, würde Ich mag das gesamte Element (ReportItem) zusammen mit seinen Kindern entfernen, dann die gefilterte schreiben. XML. Vielen Dank!

Bearbeiten - Hier ist, was ich bisher habe, aber ich bin mir nicht sicher, wie es mit dieser Ebene der Verschachtelung zur Arbeit kommen:

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

Antwort

1

Ich schlage vor, mit dem lxml Modul wirklich. Es gibt keine Verweise auf Elternelemente, wenn Pythons XML-Modul verwendet wird. Ich denke, du wirst viel einfacher mit lxml arbeiten.

1

Dies ist, was ich am Ende entwickelt habe. Ich habe festgestellt, dass es Speicherprobleme gibt, die eine Datei größer als 600 MB filtern und möglicherweise kleiner sind. Nach dem, was ich gelesen habe, gibt es Möglichkeiten, besser mit Speicher umzugehen als das ganze XML zu analysieren, aber ich habe keine Zeit zum Testen.

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() 
+0

können Sie das 'if' überprüfen, indem die Logik in XPath entfernen etwa so:' für Elem in doc.xpath ('// * [@ PluginID = "{0}"]' % nessusID.strip ('\ n')): ' – har07