Seite 1 von 1

child eines elementtrees auf wahrheit überprüfen

Verfasst: Sonntag 5. November 2006, 00:37
von murph
hi!
ich habe etwa folgendes geschrieben:

Code: Alles auswählen

    if xml_tree.tag == 'login':
        if not xml_tree.find('user'):
            return False, 'usertag'
        if xml_tree.find('password'):
            return xml_tree.find('user').text, xml_tree.find('password').text
        else:
            return xml_tree.find('user').text, None
    return False, 'logintag'
die returns sind schon für fehlerbehebung verändert.
Mein Problem ist, dass jedes Element per default nicht wahr ist.
Daher funktioniert das nicht, wie gewollt. Auch __contains__ bezieht sich auf die Attribute...Wie kann ma da sauber das Problem lösen?

Verfasst: Sonntag 5. November 2006, 10:53
von BlackJack
Mal nachsehen was `find()` so zurückgibt:

Code: Alles auswählen

In [9]: etree.dump(doc)
<doc>
 <login>foo</login>
</doc>

In [10]: print doc.find('login')
<Element login at -485eb654>

In [11]: print doc.find('xyz')
None

Verfasst: Sonntag 5. November 2006, 12:49
von murph
In [10]: print doc.find('login')
<Element login at -485eb654>
das wird aber (warum, weiß ich nicht) als falsch (False) ausgewertet.
Hier der Beweis:

Code: Alles auswählen

>>> import elementtree.ElementTree as etree
>>> a = etree.fromstring('''<doc>
...  <login>foo</login>
... </doc>''')
>>> a.find('login')
<Element login at -48204d14>
>>> if a.find('login'):
...  print "gefunden"
...
>>>

Verfasst: Sonntag 5. November 2006, 13:12
von Y0Gi
Einfach mal die Dokumentation lesen soll ja oft was bringen:
Note that in ElementTree 1.2 and earlier, the sequence behaviour means that an element without subelements tests as false (since it's an empty sequence). To check the return value from a function or method that may return None instead of a node, you must use an explicit test.

node = fetchnode()

if not node: # careful!
print "node not found, or node has no subnodes"

if node is None:
print "node not found"

Note: This behaviour is likely to change somewhat in ElementTree 1.3. To write code that is compatible in both directions, use "element is None" to test for a missing element, and "len(element)" to test for non-empty elements.

Verfasst: Sonntag 5. November 2006, 14:13
von murph
thx!