Как я могу удалить инструкцию обработки заголовка / трейлинга с помощью lxml - PullRequest
1 голос
/ 14 февраля 2020

Как я могу удалить инструкцию обработки, которая является родственным элементом root в дереве XML?

Я не могу найти ни одной функции для этого, и classi c путь не работает, потому что инструкция обработки головы / хвоста не имеет родителя:

from lxml import etree

root = etree.XML("<ROOT/><?foo?>")
tail = root.getnext()
parent = tail.getparent()  # parent is None
parent.remove(tail)

Я получаю:

Traceback (most recent call last):
  File "/path/to/demo_remove_tail_pi.py", line 6, in <module>
    parent.remove(tail)
AttributeError: 'NoneType' object has no attribute 'remove'

1 Ответ

1 голос
/ 14 февраля 2020

Это связано с тем, что инструкции по обработке генерируются вне дерева root XML. Эта проблема возникла как ошибка много лет go на сайте L XML, но, к сожалению, похоже, что соответствующее исправление не было реализовано.

Один из пользователей в потоке предоставил (hackyi sh) способ удаления инструкций обработки, сгенерированных таким образом. Просто возьмите тег, добавьте его к элементу root, а затем удалите его.

В отличие от некоторых других библиотек XML, l xml позволяет элементу появляться в одном месте. То есть вы не можете скопировать элемент в другое место; попытка переместить его в новое место, удалив из старого.

from lxml.etree import XML, tounicode

root = XML("<ROOT/><?foo?>")

print(tounicode(root.getroottree()))
>>> <ROOT/><?foo?>
tail = root.getnext()
root.append(tail)
root.remove(tail)
print(tounicode(root.getroottree()))
>>> <ROOT/>
...