Как обращаться с добавлением элементов и их родителей с помощью xpath

Хорошо, у меня есть случай, когда мне нужно добавить тег к определенному другому тегу с учетом xpath.

Пример xml:

<?xml version="1.0" encoding="UTF-8"?> <Assets> <asset name="Adham"> <general>> <services> <land/> <refuel/> </services> </general> </asset> <asset name="Test"> <general> <Something/> </general> </asset> </Assets> 

Я хочу добавить <missions> к обоим активам. Однако второму активу не хватает родительский <services> , который я хочу добавить. Каждый тег актива хранится в переменной (например, node1, node2).

У меня есть следующий xpath: xpath1 = services/missions , который из-за того, как работает моя программа, я не могу просто хранить в другой форме (т.е. у меня нет места для хранения только services )

Мне нужно проверить и посмотреть, существует ли тег миссий, и если да, ничего не делайте. Если тег не существует, мне нужно его создать. Если его родительский элемент не существует, мне тоже нужно его создать.

Как это сделать, просто используя строку xpath?

Изменить: я хочу создать все это по логическому значению: ie val = true, а затем создать тег (и родительский), если это необходимо. Если false, то удалите тег.

(У меня нет другого способа ссылаться на тег, который мне нужен (так как у меня есть слои на слоях функций для автоматизации этого процесса в большом масштабе, вы можете проверить мой предыдущий вопрос здесь Python Lxml: Добавление и удаление тегов )).

Изменить править: Еще одна проблема:

У меня нет переменной, содержащей родительский элемент добавляемого элемента, просто переменную, содержащую объект <asset> . Я пытаюсь получить родительский узел узла, который я хочу, используя xpath и переменную, указывающую на тег.

Редактирование редактируемого редактирования: не обращая внимания на вышеизложенное, я исправлю проблему, поставив xpath на указатель на родительский элемент и используя имя переменной для ссылки на каждый элемент.

 def to_xml(parent, xpath, value): """ parent: lxml.etree.Element xpath: string like 'x/y/z', anything more complex is likely to break value: anything, if is False - means delete node """ # find the node to proceed further nodes = parent.xpath(xpath) if nodes: node = nodes[0] else: parts = xpath.split('/') p = parent for part in parts: nodes = p.xpath(part) if not nodes: n = etree.XML("<%s/>" % part) p.append(n) p = n else: p = nodes[0] node = p # do whatever is specified vy value if value is False: node.getparent().remove(node) else: node.text = str(value) 

Хотя я не уверен, что сочетание функций добавления и удаления в функции 1 – это хорошая идея, но в любом случае это, скорее всего, будет работать так, как вы ожидаете.