Добавление атрибутов к существующим элементам, удаление элементов и т. Д. С помощью lxml - PullRequest
5 голосов
/ 13 июля 2010

Я анализирую в XML, используя

from lxml import etree

tree = etree.parse('test.xml', etree.XMLParser())

Теперь я хочу работать с разобранным XML. У меня возникают проблемы при удалении элементов с пространствами имен или только общих элементов, таких как

<rdf:description><dc:title>Example</dc:title></rdf:description>

и я хочу удалить весь этот элемент, а также все, что находится внутри тегов. Я также хочу добавить атрибуты к существующим элементам. Методы, которые мне нужны, находятся в классе Element, но я не знаю, как использовать это с объектом ElementTree здесь. Любые указатели, безусловно, будут оценены, спасибо

Ответы [ 2 ]

14 голосов
/ 13 июля 2010

Вы можете добраться до корневого элемента с помощью этого вызова: root=tree.getroot()

Используя этот корневой элемент, вы можете использовать findall() и удалять элементы, которые соответствуют вашим критериям:

deleteThese = root.findall("title")
for element in deleteThese: root.remove(element)

Наконец, вы можете увидеть, как выглядит ваше новое дерево, с помощью этого: etree.tostring(root, pretty_print=True)

Вот некоторая информация о том, как работает find / findall: http://infohost.nmt.edu/tcc/help/pubs/pylxml/class-ElementTree.html#ElementTree-find

Чтобы добавить атрибут кэлемент, попробуйте что-то вроде этого:

root.attrib['myNewAttribute']='hello world'
1 голос
/ 13 июля 2010

Метод remove должен делать то, что вы хотите:

>>> from lxml import etree
>>> from StringIO import StringIO

>>> s = '<Root><Description><Title>foo</Title></Description></Root>'
>>> tree = etree.parse(StringIO(s))

>>> print(etree.tostring(tree.getroot()))
<Root><Description><Title>foo</Title></Description></Root>

>>> title = tree.find('//Title')
>>> title.getparent().remove(title)
>>> etree.tostring(tree.getroot())
'<Root><Description/></Root>'

>>> print(etree.tostring(tree.getroot()))
<Root><Description/></Root>
...