2016-03-31 4 views
3

Python初心者はフィルタリング.xmlファイルのヘルプが必要です。私はほとんど成功してxml.etree.ElementTreeで試してきました。フィルタxml/nessusはPythonを使ってスキャンします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') 

答えて

1

私は本当にlxmlのモジュールを使用することをお勧め。 Pythonのxmlモジュールを使用する場合、親要素への参照はありません。私はあなたがlxmlを使ってずっと簡単になると思います。

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

あなたがそうのようなXPathのにロジックを移動することで 'if'チェックを削除することができます:' doc.xpath内のelemのための( '// * [@のPluginID = "{0}"]' %nessusID.stripを( '\ n')): ' – har07

関連する問題