Cómo manejar la adición de elementos y sus padres usando xpath.

Ok, tengo un caso en el que necesito agregar una etiqueta a otra etiqueta dada una xpath.

Ejemplo xml:

   >             

Quiero agregar una etiqueta a ambos activos. Sin embargo, al segundo recurso le falta la etiqueta , que quiero agregar. Cada etiqueta de activo se almacena en una variable (por ejemplo, node1, node2).

Tengo la siguiente xpath: xpath1 = services/missions , que, debido a la forma en que funciona mi progtwig, no puedo simplemente almacenar en una forma diferente (es decir, no tengo un lugar para almacenar solo services )

Necesito verificar y ver si la etiqueta de las misiones ya existe y, si es así, no hacer nada. Si la etiqueta no existe, necesito crearla. Si su padre no existe, necesito crear eso también.

¿Cómo puedo hacer esto simplemente usando la cadena xpath?

Edición: quiero basar todo esto en un valor booleano: es decir, val = true, luego crear una etiqueta (y un elemento primario) si es necesario. Si es falso, entonces elimine la etiqueta.

(No tengo otra forma de referirme a la etiqueta que necesito (ya que tengo capas en capas de funciones para automatizar este proceso a gran escala, puede consultar mi pregunta anterior aquí Python Lxml: Agregar y eliminar tags )).

Editar Editar: Otro tema:

No tengo una variable que contenga el elemento primario del elemento que agregar, solo una variable que contiene el objeto . Estoy tratando de obtener el padre del nodo que quiero usando la xpath y una variable que apunta a la etiqueta `.

Editar Editar Editar: no importa lo anterior, arreglaré el problema acortando la ruta x para indicar al padre y usando un nombre de variable para referirme a cada elemento.

 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) 

Aunque no estoy seguro de que la combinación de la funcionalidad agregar y quitar en una función sea una buena idea, de todos modos es probable que funcione como usted espera.