I need to check whether a certain tag exists in an xml file.
For example, I want to see if the tag exists in this snippet:
<main> <elem1/> <elem2>Hi</elem2> <elem3/> ... </main>
Currently, I am using an ugly hack with error checking, like this:
try: if root.elem1.tag: foo = elem1 except AttributeError: foo = "error finding elem1"
I also want to customize the string if it is unable to find the node (i.e. "unable to find -tagname-").
I have to check a long list of variables, and I don't want to repeat the code 100 times.
Any suggestions?
Edit:
Here is a snip of the actual xml file:
<main> <asset name="Virtual Dvaered Unpresence"> <virtual/> <presence> <faction>Dvaered</faction> <value>-1000.000000</value> <range>0</range> </presence> </asset> <asset name="Virtual Empire Small"> <virtual/> <presence> <faction>Empire</faction> <value>100.000000</value> <range>2</range> </presence> </asset> </main>
I want to check whether the tag exists, and, if so, to get the contents.
Edit edit: Ok, I am going to combine two of the answers, but I can only vote for one. Sorry.
Edit 3: Related question about XPath here: Python lxml (objectify): Xpath troubles
hasattr()
works for this:
if hasattr(root, 'elem1'): foo = root.elem1
Edit: updated answer for sample file.
I'm assuming you want to search each asset for certain tags. If so, the following worked for me:
import lxml.objectify # Parse the file. tree = lxml.objectify.parse('sample.xml') root = tree.getroot() # Which elements to find. to_find = set(['presence/faction', 'presence/value', 'fake']) # Go through each asset in the document. for asset in root.findall('asset'): # Check for each element. for name in to_find: node = asset.find(name) if node is not None: print 'Found %s, its value is %s' % (name, node) else: print 'Unable to find %s' % name
The output was:
Found presence/value, its value is -1000.0 Found presence/faction, its value is Dvaered Unable to find fake Found presence/value, its value is 100.0 Found presence/faction, its value is Empire Unable to find fake
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With