2017-02-09 55 views
0

我必须创建一个具有根名“结构”的xml文件,它应该由各种子元素“包”组成,每个子包含元素的树结构。一个数据包应该如下所示:通过遍历一组值来在python中创建XML文件

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

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

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

Th数据包应重复“n”次。 它给出了一些错误说:

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

虽然我:不受约束的方法写()必须与ElementTree的实例(而不是得到了海峡实例)

这是我所编写的代码被称为得到了一个XML文件作为输出,但最后一个条目似乎覆盖了所有以前的条目,并且只有'数据包'的最后一次迭代存储在我生成的xml文件中。

我需要修改什么来获得完整的树迭代并纠正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()