2017-02-09 13 views
0

ルート名 'structure'を持つxmlファイルを作成する必要があり、それぞれに要素のツリー構造を含むさまざまなサブ要素 "packets"で構成する必要があります。 1つのパケットは次のようになります。値のセットを反復してPythonでXMLファイルを作成する

<L2> 
     <srcmac>value1</srcmac> 
     <dstmac>value2</dstmac> 
    </L2> 

    <L3> 
     <dscp> 
      <timetolive>value3</timetolive> 
     </dscp> 
    </L3> 

    <L4> 
     <protocol>value4</protocol> 
    </L4> 

Thパケットは 'n回'繰り返す必要があります。結合していないメソッドの書き込みを()ElementTreeのインスタンスで呼び出さなければなりません(代わりにstrのインスタンスを得た)

これは私が書いたコードです:私が、

import xml.etree.cElementTree as et 

import pcapy 

import sys 

from struct import* 

def main(): 

    count=1 

    root=et.Element("structure") 

     #creating xml layout 
    eachpacket=et.SubElement(root,"packet") 


    while count<n: 
     child1=et.SubElement(eachpacket,"L2") 
     subchild1=et.SubElement(child1,"smac") 
     subchild2=et.SubElement(child1,"dmac") 

     child2=et.SubElement(eachpacket,"L3") 
     sub1=et.SubElement(child2,"sip")  
     sub2=et.SubElement(child2,"dip")  
     sub3=et.SubElement(child2,"dscp") 
     s2=et.SubElement(sub3,"timetolive") 

     child3=et.SubElement(eachpacket,"L4") 
     schild1=et.SubElement(child3,"protocol") 
     try: 
     count=count+1 

     subchild1.text=str(value1) 
     subchild2.text=str(value2) 
     s2.text=str(value3) 
     schild1.text=str(protocol) 

     except:  
     break 

     else: 
     tree=et.ElementTree(root) 
     tree.write("FileNew.xml") 
     pass 

if __name__== "__main__": 
     main() 

それは言っていくつかのエラーを与えますXMLファイルを出力として取得しましたが、最後のエントリはすべての前のエントリを上書きするように見え、生成されたxmlファイルには最後の 'packet'の反復のみが格納されます。

完全なツリーを繰り返し作成し、write()エラーを修正するには、何を修正する必要がありますか?

+0

x、value1、value2、value3、およびprotocolの値は何ですか?すべてのコードを表示します。 – swatchai

+0

@swatchai実際には.pcap(パケット)ファイルを読み込み、ソースmac、宛先MACアドレスを取得し、packet.next()を使用してpcapファイルの次のパケットに移動します。私はそれに問題はないことを確認しました。しかし、私はetreeの概念だけでなく、Pythonにも新しいので、私は正しい出力を得るために何をする必要があるのか​​理解できません。今のところ、 "パケット"のすべての反復にvalue1、value2などの値を印刷してみることができます.....私の問題を解決する方法を提案できますか? –

答えて

0

あなたのコードでスタイルの改善を含むいくつかの修正を行い、あなたのライブラリやロジックがないので、プロトコルのような値をプレースホルダに置き換えました。私がテストしたところでは、両方の問題を解決します。

from xml.etree import cElementTree as et 


n = 5 
value1 = 'value1' 
value2 = 'value2' 
value3 = 'value3' 
protocol = 'protocol' 


def main(): 
    root = et.Element("structure") 

    # creating xml layout 
    eachpacket = et.SubElement(root, "packet") 

    for count in range(n): 
     child1 = et.SubElement(eachpacket, "L2") 
     subchild1 = et.SubElement(child1, "smac") 
     subchild2 = et.SubElement(child1, "dmac") 

     child2 = et.SubElement(eachpacket, "L3") 
     sub1 = et.SubElement(child2, "sip") 
     sub2 = et.SubElement(child2, "dip") 
     sub3 = et.SubElement(child2, "dscp") 
     s2 = et.SubElement(sub3, "timetolive") 

     child3 = et.SubElement(eachpacket, "L4") 
     schild1 = et.SubElement(child3, "protocol") 

     subchild1.text = str(value1) 
     subchild2.text = str(value2) 
     s2.text = str(value3) 
     schild1.text = str(protocol) 

    et.ElementTree.write(et.ElementTree(root), "FileNew.xml") 


if __name__ == "__main__": 
    main() 
関連する問題