#python #xml #elementtree
#python #xml #elementtree
Вопрос:
У меня есть несколько XML-файлов, которые мне нужно сравнить. Проблема в том, что в ней есть два элемента, которые необходимо удалить, потому что они всегда разные.
<section name="Cache">
<section name="Registry">
<key name="Expiration" description="Value range: 0 - amp;amp;infin; Seconds" summary="Defines the registry entry cache expiration time" range="0-" type="integer" defaultvalue="300" modifiedby="user_x" modificationtime="2020-11-17T12:08:36.1900000 00:00" readonly="False" ismultivalue="False">300</key>
</section>
<section name="UserSession">
<key name="Expiration" description="Value range: 0 - amp;amp;infin; Seconds" summary="Defines the session cache expiration time" range="0-" type="integer" defaultvalue="30" modifiedby="user_x" modificationtime="2020-11-17T12:08:36.1900000 00:00" readonly="False" ismultivalue="False">30</key>
</section>
</section>
modifiedby
является константой в xml, поэтому я могу удалить ее с помощью:
tree = ET.parse(xml1)
root = tree.getroot()
xmlstr = ET.tostring(root, encoding='utf8', method='xml')
xmlstr = xmlstr.replace(b'user_x', b'')
Но как я могу удалить modificationtime
из xml, зная, что это переменная, которую нельзя предсказать? Это modificationtime
возвращает в каждом элементе XML
Комментарии:
1. Вы хотите удалить значение только этого атрибута или вообще удалить атрибут?
Ответ №1:
Лучше выполнить все замены, работающие с ElementTree
ней, прежде чем преобразовывать ее обратно в строку, иначе нет смысла вообще анализировать XML:
import xml.etree.ElementTree as ET
tree = ET.parse(xml1)
root = tree.getroot()
# here we go
for key in root.findall('.//key'):
key.attrib['modifiedby'] = ''
key.attrib['modificationtime'] = ''
# and finally convert to bytestring
xmlstr = ET.tostring(root, encoding='utf8', method='xml') # add .decode() to get string
.//key
вот выражение XPath, вы можете прочитать больше об этом в последнем стандарте языка XML Path. Это поможет вам адаптировать код для работы с XML-документом с другой структурой.