Удалите весь тег из XML с помощью ElementTree - PullRequest
0 голосов
/ 17 июня 2020

Я создаю сценарий для очистки тегов и атрибутов из файла XML, который мне нужно загрузить.

Пример структуры:

<Cli TipCli="1" NmCli="client_name">
    <EndEtnCli EmaiCli="client_email"/>
</Cli>

Если атрибут EmailCli - пустой, я хочу удалить весь тег <EndEtnCli/>.

Я выполнил несколько руководств здесь и вошел в этот код ниже, он не показывает никаких ошибок, но не работает вообще.

Что мне не хватает?

import xml.etree.ElementTree as ET
from datetime import date

tree = ET.parse('src/021/sample.xml')
root = tree.getroot()

for client in root:
  # sanitize email from client
  el = client.find('EndEtnCli')
  if el.attrib.get('EmaiCli') == '': client.remove(el)

currentDate = date.today().strftime('%Y%m%d')
tree.write(f'src/021/test_{ currentDate }', encoding="utf-8")

1 Ответ

0 голосов
/ 17 июня 2020

Ниже

import xml.etree.ElementTree as ET

xml = '''<r>
     <Cli TipCli="1" NmCli="client_name1">
       <EndEtnCli EmaiCli=""/>
     </Cli>  
     <Cli TipCli="2" NmCli="client_name2">
       <EndEtnCli/>
     </Cli>
     <Cli TipCli="3" NmCli="client_name3">
       <EndEtnCli EmaiCli="client_email"/>
     </Cli>
     </r>'''
root = ET.fromstring(xml)
cli_lst = root.findall('.//Cli')
for cli in cli_lst:
    child = cli.find('./EndEtnCli')
    email_cli = child.attrib.get('EmaiCli')
    if email_cli is None or len(email_cli) == 0:
        cli.remove(child)
ET.dump(root)

вывод

<r>
     <Cli NmCli="client_name1" TipCli="1">
       </Cli>  
     <Cli NmCli="client_name2" TipCli="2">
       </Cli>
     <Cli NmCli="client_name3" TipCli="3">
       <EndEtnCli EmaiCli="client_email" />
     </Cli>
 </r>
...