Удалите указанный тег c xml с ElementTree в python - PullRequest
2 голосов
/ 27 мая 2020

Я ищу способ удалить указанный c тег <e>, который имеет значение mmm в xml файле (т.е. <e>mmm</e>. Я имею в виду эту ветку как руководство для начинающих: Как удалить элементы из XML с помощью Python без использования библиотеки lxml вместо использования ElementTree с python v2.6.6. Я пытался соединить точку с потоком и читал при ElementTree api do c но я не добился успеха.

Я ценю ваш совет и подумал над этим.

<?xml version='1.0' encoding='UTF-8'?>
<parent>
   <first>
     <a>123</a>                              
     <c>987</c>
       <d>
         <e>mmm</e>
         <e>yyy</e>           
       </d>         
   </first>
   <second>
     <a>456</a>                      
     <c>345</c>
       <d>
         <e>mmm</e>
         <e>hhh</e>            
       </d>
   </second>
 </parent>

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Мне потребовалось время, чтобы понять, что все теги <e> являются подузлами <d>.

Если мы можем предположить, что вышесказанное верно для всех ваших целевых узлов (<e> узлы со значением mmm), вы можете использовать этот скрипт. (Я добавил несколько дополнительных узлов, чтобы проверить, работает ли он

import xml.etree.ElementTree as ET

xml_string = """<?xml version='1.0' encoding='UTF-8'?>
<parent>
   <first>
     <a>123</a>                              
     <c>987</c>
       <d>
         <e>mmm</e>
         <e>aaa</e>
         <e>mmm</e>
         <e>yyy</e>           
       </d>         
   </first>
   <second>
     <a>456</a>                      
     <c>345</c>
       <d>
         <e>mmm</e>
         <e>hhh</e>            
       </d>
   </second>
 </parent>"""

# this is how I create my root, if you choose to do it in a different way the end of this script might not be useful
root = ET.fromstring(xml_string)

target_node_first_parent = 'd'
target_node = 'e'
target_text = 'mmm'

# find all <d> nodes
for node in root.iter(target_node_first_parent):
    # find <e> subnodes of <d>
    for subnode in node.iter(target_node):
        if subnode.text == target_text:
            node.remove(subnode)

# output the result         
tree = ET.ElementTree(root)
tree.write('output.xml')

Я попытался просто удалить узлы, найденные root.iter(yourtag), но, видимо, это невозможно из root (очевидно, это было не то easy )

Дайте мне знать, помогло ли вам это! Я не слишком знаком с XML, если бы я вырезал какую-то терминологию, я был бы рад услышать и выучить!

1 голос
/ 28 мая 2020

Ответ @Queuebee совершенно правильный, но если вы хотите читать из файла, приведенный ниже код предоставляет способ сделать это.

import xml.etree.ElementTree as ET

file_loc = " "
xml_tree_obj = ET.parse(file_loc)

xml_roots = xml_tree_obj.getroot()

target_node_first_parent = 'd'
target_node = 'e'
target_text = 'mmm'

# find all <d> nodes
for node in xml_roots.iter(target_node_first_parent):
    # find <e> subnodes of <d>
    for subnode in node.iter(target_node):
        if subnode.text == target_text:
            node.remove(subnode)

out_tree = ET.ElementTree(xml_roots)
out_tree.write('output.xml')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...