Python xml find element by tag value

I am using python xmlElementTree and want to assign or modify a xml element value based on its attribute. Can somebody give me an idea how to do this?

For example: Here is a xml file and I need to set the value for the element "number" based on the attribute "sys/phoneNumber/1", "sys2/SMSnumber/1" and so on.


    
        
        
        
    

    
        
        
    

edit: Added closure for the tag root in the XML file.

1stthomas

7212 gold badges15 silver badges22 bronze badges

asked Mar 21, 2012 at 1:03

You can access the attribute value as this:

from elementtree.ElementTree import XML, SubElement, Element, tostring

text = """

    
        
        
        
    

    
        
        
    

"""

elem = XML[text]
for node in elem.find['phoneNumbers']:
    print node.attrib['topic']
    # Create sub elements
    if node.attrib['topic']=="sys/phoneNumber/1":
        tag = SubElement[node,'TagName']
        tag.attrib['attr'] = 'AttribValue'

print tostring[elem]

forget to say, if your ElementTree version is greater than 1.3, you can use XPath:

elem.find['.//number[@topic="sys/phoneNumber/1"]']

//effbot.org/zone/element-xpath.htm

or you can use this simple one:

for node in elem.findall['.//number']:
    if node.attrib['topic']=="sys/phoneNumber/1":
        tag = SubElement[node,'TagName']
        tag.attrib['attr'] = 'AttribValue'

answered Mar 21, 2012 at 1:35

focusheartfocusheart

3272 silver badges3 bronze badges

4

For me this Elementtree snipped of code worked to find element by attribute:

import xml.etree.ElementTree as ET
tree = ET.parse['file.xml']
root = tree.getroot[]


topic=root.find[".//*[@topic='sys/phoneNumber/1']"].text

answered Feb 28, 2019 at 20:15

Eduard FlorinescuEduard Florinescu

15.6k28 gold badges108 silver badges171 bronze badges

I'm not familiar with xmlElementTree, but if you're using something capable of xpath expressions you can locate a node by attribute value using an expression like this:

//number[@topic="sys/phoneNumber/1"]

So, using the etree module:

>>> import lxml.etree as etree
>>> doc = etree.parse['foo.xml']
>>> nodes = doc.xpath['//number[@topic="sys/phoneNumber/1"]']
>>> nodes
[]
>>> etree.tostring[nodes[0]]
'\n    '

answered Mar 21, 2012 at 1:16

larskslarsks

241k37 gold badges358 silver badges348 bronze badges

larsks explains how to use XPath to find what you are after very well. You also wanted to change an attribute. The best way is probably to add a new attribute and remove the original. Once you get the nodes result, it is a list with a single entry [number].

# This returns sys/phoneNumber/1
nodes[0].get["topic"]
# To change the value, use set 
nodes[0].set["topic", "new/value/of/phone/number"]

Hope this helps.

Also, your ending root tag doesn't close properly.

answered Mar 21, 2012 at 1:58

How do I find a specific tag in XML in Python?

Use xml..
tree = ElementTree. parse["sample.xml"].
root = tree. getroot[].
dogs = root. findall["dog"].
for dog in dogs:.
print[dog. text].

How do I find tags in XML?

If you use findAll for the root element of the tree, it searches all subelements. You can also use it on the ElementTree object, instead of the root element, and then it also searches the root.

How do you add a tag to XML in Python?

Add them using Subelement[] function and define it's text attribute..
child=xml. Element["employee"] nm = xml. SubElement[child, "name"] nm. text = student. ... .
import xml. etree. ElementTree as et tree = et. ElementTree[file='employees.xml'] root = tree. ... .
import xml. etree. ElementTree as et tree = et..

Chủ Đề