2016-03-31 18 views
3

Python acemi, .xml dosyalarını filtrelemek için yardıma gereksinim duyar. Xml.etree.ElementTree ile biraz başarıya ulaşmaya çalışıyorum.Filtre kullanarak xml/nessus taraması ElementTree

xml şöyle görünür:

<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 bir kara listedeki bir öğeyi eşleşirse, ben, onun çocukları ile birlikte tüm elemanını (ReportItem) kaldırmak sonra süzülür yazmak istiyorum. xml. Teşekkürler!

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

cevap

1

Gerçekten Lxml modülü kullanarak önermek: -

Düzenleme İşte ben bugüne kadar ama yuvalama bu düzeyde çalışmak için nasıl emin değilim zaten. Python'un xml modülünü kullanırken ana öğelere başvuru yoktur. Bence lxml kullanarak çok daha kolay bir zamana sahip olacaksın.

1

Gelişmekte olan şey budur. 600 MB'den büyük bir dosyayı filtreleyen ve belki daha küçük olan bellek sorunları olduğunu gördüm. Okuduklarımdan, hafızayı bütün xml'yi ayrıştırmaktan daha iyi bir şekilde halletmenin yolları var, ama test etmek için zamanım yok. `Elem için doc.xpath olarak ('// * [@ pluginID = "{0}"]' % nessusID.strip:

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

Eğer' şöyle XPath'ın mantık içine taşıyarak kontrol if' kaldırabilir (\ 'n')): ' – har07