child eines elementtrees auf wahrheit überprüfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 5. November 2006, 00:37

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?
http://www.cs.unm.edu/~dlchao/flake/doom/
BlackJack

Sonntag 5. November 2006, 10:53

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
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 5. November 2006, 12:49

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"
...
>>>
http://www.cs.unm.edu/~dlchao/flake/doom/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 5. November 2006, 13:12

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.
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Sonntag 5. November 2006, 14:13

thx!
http://www.cs.unm.edu/~dlchao/flake/doom/
Antworten