Python ElementTree: замена элементов в цикле - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать сценарий, который зацикливает создание файла XML с увеличивающимися значениями для двух элементов.(IP-адрес, использующий netaddr, и увеличивающийся элемент 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')

Я выяснил, как создать XML, который мне нужен, с помощью ElementTree, и если я закомментирую свой цикл инапишите полученный xml, он правильный, хорошо выглядит и работает с инструментом, который его использует (ууу!).

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

Однако, когда я добавляю свой цикл для замены значений для двух элементов, я просто не могу понять, как это правильно, и я забиваю теги / элементы в дереве.

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

Я продолжаю пробовать разные вещи, чтобы заменить элементы, но они просто заканчиваются как различные сочетания неправильных, и я просто не могу понять, что это правильно.Надеюсь, кто-то может помочь мне понять, что я скучаю.Заранее спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

это элемент, а "ip" это атрибут этого элемента.
Мы можем изменить атрибут для элемента следующим образом:

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

"tag1" - это .text внутри элемента , но мы переназначили переменную тега в этой строке:

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

В соответствии с тем, что мы присвоили собственный объект тега тексту элемента тега вместо номера тега.
Я обновил ваш код.Теперь это решение генерирует новый XML на каждой итерации «count».Надеюсь, это поможет.

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:

<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>
...