简体   繁体   English

Python ElementTree:在循环中替换元素

[英]Python ElementTree: replacing elements in a loop

I'm trying to create a script that loops creating an xml file, with incrementing values for two elements. 我正在尝试创建一个脚本,该脚本循环创建一个xml文件,并为两个元素增加值。 (an IP address using netaddr, and the tag/member element that increments, tag01 - tag10) (使用netaddr的IP地址,以及递增的tag / member元素,tag01-tag10)

from netaddr import IPNetwork
import xml.dom.minidom
import lxml.etree as etree
import xml.etree.cElementTree as ET

ip = IPNetwork('10.10.10.0/24')
count = 1
tag = range(1,10)

uid = ET.Element("message")
type = ET.SubElement(uid, "type").text = "update"
payload = ET.SubElement(uid, "payload")
register = ET.SubElement(payload, "register")
entry = ET.SubElement(register, "entry", ip="11.11.11.11")
tag = ET.SubElement(entry, "tag")
ET.SubElement(tag, "member").text = "tag1"
tree = ET.ElementTree(uid)

while count <= 10:
    elemtag = tree.findall(".//member")
    for elemt in elemtag:
        elemt.text = 'tag{}'.format(tag)
    elemip = tree.findall(".//entry")
    for elemi in elemip:
        elemi.text = 'ip="{}"'.format(ip)
    count += 1
    ET.dump(uid)
    print(count)

    #tree.write("tmp.xml")
    #x = etree.parse("tmp.xml")
    #print etree.tostring(x, pretty_print=True)
    #etree.parse("tmp.xml").write("pretty.xml", encoding="utf-8", pretty_print=True)
    #os.system('tool.py -f pretty.xml')

I figured out how to create the xml I needed using ElementTree, and if I comment out my loop and write the the resulting xml, it's correct, looks good, and works with the tool that consumes it (yay!). 我想出了如何使用ElementTree创建所需的xml,如果注释掉循环并编写生成的xml,它是正确的,看起来不错,并且可以使用消耗它的工具(是的!)。

<message>
  <type>update</type>
  <payload>
    <register>
      <entry ip="11.11.11.11">
        <tag>
          <member>tag1</member>
        </tag>
      </entry>
    </register>
  </payload>
</message>

However, when I add my loop to replace the values for the two elements, I just cant seem to get it right, and I'm clobbering the tags/elements in the tree. 但是,当我添加循环以替换两个元素的值时,我似乎无法正确理解它,并且正在破坏树中的标签/元素。

<message>
  <type>update</type>
  <payload>
    <register>
      <entry ip="11.11.11.11">ip="10.10.10.0/24"<tag><member>tag&lt;Element 'tag' at 
0x7f7b29d66c90&gt;</member></tag></entry>
    </register>
  </payload>
</message>

I keep trying different things to replace the elements, but they just end up as different permutations of wrong, and I just can't seem to get it right. 我一直在尝试不同的方法来替换元素,但是它们最终都以错误的不同排列而告终,而且我似乎无法正确地做到这一点。 Hoping someone can help me figure out what I'm missing. 希望有人可以帮助我弄清楚我所缺少的。 Thanks in advance! 提前致谢!

< Entry > it's an element and "ip" it's an attribute of that element. <Entry>是元素,“ ip”是该元素的属性。
We can change the attribute for the element in the following way: 我们可以通过以下方式更改元素的属性:

tree.find('.//entry').attrib['ip'] = "22.22.22.22"

"tag1" it's .text inside of the < member > element but we reassigned the tag variable at this line: “ tag1”是<member>元素内的.text,但我们在这一行重新分配了tag变量:

tag = ET.SubElement(entry, "tag")

According that we assigned own tag object to the tag element's text instead of tag number. 据此,我们将自己的标签对象分配给标签元素的文本,而不是标签编号。
I updated your code. 我更新了您的代码。 Now this solution generates new XML < message > at each "count" iteration. 现在,此解决方案在每次“计数”迭代时生成新的XML <message>。 I hope it will help. 希望对您有所帮助。

from netaddr import IPNetwork
import xml.etree.cElementTree as ET

ip = IPNetwork('10.10.10.0/24')
tag_lst = list(range(1, 11))
count = 1

uid = ET.Element("message")
type = ET.SubElement(uid, "type").text = "update"
payload = ET.SubElement(uid, "payload")
register = ET.SubElement(payload, "register")
entry = ET.SubElement(register, "entry", ip="11.11.11.11")
tag = ET.SubElement(entry, "tag")
ET.SubElement(tag, "member").text = "tag1"
tree = ET.ElementTree(uid)

while count <= 10:
    tree.find('.//member').text = "tag"+str(count)
    tree.find('.//entry').attrib['ip'] = format(ip[count])
    count += 1
    ET.dump(uid)
    print(count)

XML output is: XML输出为:

<message><type>update</type><payload><register><entry ip="10.10.10.1"><tag><member>tag1</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.2"><tag><member>tag2</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.3"><tag><member>tag3</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.4"><tag><member>tag4</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.5"><tag><member>tag5</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.6"><tag><member>tag6</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.7"><tag><member>tag7</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.8"><tag><member>tag8</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.9"><tag><member>tag9</member></tag></entry></register></payload></message>
<message><type>update</type><payload><register><entry ip="10.10.10.10"><tag><member>tag10</member></tag></entry></register></payload></message>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM