Проблема высокого уровня, которую я пытаюсь решить, заключается в том, что у меня есть дамп данных SMS размером 1,5 ГБ, и я пытаюсь отфильтровать файл, чтобы сохранить только сообщения для одного контакта и от него.
Я использую lxml в Python для анализа файла, но дайте мне знать, если есть варианты получше.
Структура XML-файла выглядит следующим образом:
SMSES (root node)
'count': 'xxxx',
(Children):
MMS
'address': 'xxxx',
'foo': 'bar',
... : ...,
(Children)
'other fields': 'that _do not_ specify address',
MMS
'address': 'xxxx',
'foo': 'bar',
... : ...,
(Children)
'other fields': 'that _do not_ specify address'
т. е. я хочу обойти дочерние элементы корневого узла и для каждого MMS, где «адрес» не соответствует определенному значению, удалить это MMS и все его потомки (дочерние элементы, как правило, содержат такие элементы, как изображения и т. д.).
Что я пробовал:
Я нашел такие вопросы/ответы: как удалить элемент в lxml а>
Но эти потоки, как правило, имеют простые примеры без вложенных элементов.
- Мне непонятно, как использовать
tree.xpath()
для поиска элементов, которые не соответствуют значению - Мне не ясно, удаляет ли вызов
remove(item)
потомков элемента (чего я хочу в данном случае).
Я попробовал очень наивный подход, в котором я получаю итератор, а затем прохожу по дереву, удаляя элементы по мере продвижения:
from lxml.etree import XMLParser, parse
p = XMLParser(huge_tree=True)
tree = parse('backup.xml', parser=p)
it = tree.iter()
item = next(it) # consume root node
for item in it:
if item.attrib['address'] != '0000':
item.getparent().remove(item)
Проблема с этим сценарием заключается в том, что итератор выполняет DFS, а дочерние элементы MMS не имеют поля адреса. Итак, я ищу:
- Каков наиболее эффективный + достаточно простой способ выполнить мою задачу?
- В противном случае, как я могу заставить
tree.iter()
предоставить мне итератор BFS только для соседей первой степени корня? - Действительно ли remove(item) удаляет всех потомков или прикрепляет дочерние элементы к родителю?
Спасибо, что нашли время прочитать. Извините, если это наивный вопрос — синтаксический анализ XML-файлов на самом деле не мой хлеб с маслом, и мне как новичку было трудно читать документацию по LXML.
Спасибо!