For:
<foo>
<bar key="value">text</bar>
</foo>
How do I get "value"?
xml.findtext("./bar[@key]")
Throws an error.
For:
<foo>
<bar key="value">text</bar>
</foo>
How do I get "value"?
xml.findtext("./bar[@key]")
Throws an error.
This will find the first instance of an element named bar
and return the value of the attribute key
.
In [52]: import xml.etree.ElementTree as ET
In [53]: xml=ET.fromstring(contents)
In [54]: xml.find('./bar').attrib['key']
Out[54]: 'value'
Getting child tag's attribute value in a XML using ElementTree
Parse the XML file and get the root
tag and then using [0]
will give us first child tag. Similarly [1], [2]
gives us subsequent child tags. After getting child tag use .attrib[attribute_name]
to get value of that attribute.
>>> import xml.etree.ElementTree as ET
>>> xmlstr = '<foo><bar key="value">text</bar></foo>'
>>> root = ET.fromstring(xmlstr)
>>> root.tag
'foo'
>>> root[0].tag
'bar'
>>> root[0].attrib['key']
'value'
If the xml content is in file. You should do below task to get the root
.
>>> tree = ET.parse('file.xml')
>>> root = tree.getroot()
By following method you can get all attributes from xml (in Dictionary)
import xml.etree.ElementTree as etree
xmlString= "<feed xml:lang='en'><title>World Wide Web</title><subtitle lang='en'>Programming challenges</subtitle><link rel='alternate' type='text/html' href='http://google.com/'/><updated>2019-12-25T12:00:00</updated></feed>"
xml= etree.fromstring(xmlString)
def get_attr(xml):
attributes = []
for child in (xml):
if len(child.attrib)!= 0:
attributes.append(child.attrib)
get_attr(child)
return attributes
attributes = get_attr(xml)
print(attributes)
Your expression:
./bar[@key]
It means: bar
children having key
attribute
If you want to select the attribute, use this relative expression:
bar/@key
It means: the key
attribute of bar
children
Of course, you need to consider to use a fully compliant XPath engine like lxml.
ElementTree
API it's not a full complain XPath engine... –
Betty bar/@key
and you have to use xxx.attribut.get("key")
for the appropriate xxx
. –
Bugbear dipenparmar12 function will not return the childrens child attributes. Because the function is recursive the attributes list will be set to a empty list for each call. This function will has return the childrens child.
import xml.etree.ElementTree as etree
xml= etree.fromstring(xmlString)
def get_attr(xml, attributes):
for child in (xml):
if len(child.attrib)!= 0:
attributes.append(child.attrib)
get_attr(child,attributes)
return attributes
attributes = get_attr(xml,[])
print(attributes)
For going deeper into the tree this type of functions can be used.
root[1][2][0].tag # For displaying the nodes
root[1][2][0].text # For showing what's inside the node
© 2022 - 2025 — McMap. All rights reserved.
<image height="940" id="0" name="C02032-390.jpg" width="1820"> <box label="Objects" occluded="1" xbr="255" xtl="0" ybr="624" ytl="509"> <attribute name="Class">Car</attribute> </box> </image>
I would like to access "Car" from the attribute. – Kinematograph