На самом деле, Element
всегда присоединяется к ElementTree
, даже если оно выглядит «отсоединенным»:
root = etree.XML("<ROOT/>")
assert root.getroottree() is not None
Когда мы используем addprevious
/ addnext
для вставки инструкции обработки до / после элемента root, PI не привязаны к родительскому элементу (их нет), но вместо этого они присоединены к дереву root.
Итак, проблема заключается в использовании tounicode
(или tostring
). Рекомендуется распечатать XML дерева root, а не элемент root.
from lxml import etree
root = etree.XML("<ROOT/>")
root.addprevious(etree.ProcessingInstruction("foo"))
root.addnext(etree.ProcessingInstruction("bar"))
print(etree.tounicode(root))
# => "<ROOT/>"
print(etree.tounicode(root.getroottree()))
# => "<?foo ?><ROOT/><?bar ?>"