Я анализирую многие тысячи XML-файлов, каждый из которых обычно содержит более 200 тегов, которые могут сильно различаться. Чтобы сравнить их, я хочу иметь возможность собрать их структуры, а затем сравнить каждый уровень вложенных тегов между различными файлами.
Кажется, что лучше использовать вложенные словари, и этот код громоздок, но он работает для каждого уровня вложенности, который я нахожу и использую.
import xml.etree.ElementTree as ET
strip_ns = lambda xx: str(xx).split('}', 1)[1]
tree = ET.parse('xmlpath.xml')
root = tree.getroot()
tierdict = {}
for tier1 in root:
tier1var = strip_ns(tier1.tag)
tierdict[tier1var] = {}
for tier2 in tier1:
tier2var = strip_ns(tier2.tag)
tierdict[tier1var][tier2var] = {}
for tier3 in tier2:
tier3var = strip_ns(tier3.tag)
tierdict[tier1var][tier2var][tier3var] = {}
for tier4 in tier3:
tier4var = strip_ns(tier4.tag)
tierdict[tier1var][tier2var][tier3var][tier4var] = {}
Тем не менее:
1) Есть ли более эффективный способ закодировать это как есть, особенно когда речь идет об идентификации каждого «уровня» / уровня вложенности?
2) Что более важно, есть ли способ сделать такой цикл для вложения неизвестной глубины? Некоторые из этих файлов могут занимать 10 или 20 вложений, и у меня нет возможности проверить их вручную.