Seite 1 von 2

If anweisung

Verfasst: Montag 10. Oktober 2005, 10:41
von abstract
hi! also ich parse an einem xml für blender import rum und krieg die if-anweisung nicht gebacken !
also der Inhalt von n wird ausgegeben und das "TEST" nicht!
weiß jemand warum ?!

Code: Alles auswählen

for element in doc.getElementsByTagName("name"):

    n=element.firstChild.data
    print n
    
    if n == "Walther":
        print "TEST"
Edit (Leonidas): Code in Python-Tags gesetzt.

Verfasst: Montag 10. Oktober 2005, 11:53
von jens
Wahrscheinlich ist n ein Objekt und kein String... Es geht bestimmt so:

Code: Alles auswählen

 if str(n) == "Walther": 

Verfasst: Montag 10. Oktober 2005, 12:02
von mbierenfeld
Servus

Code: Alles auswählen


for book in dom.getElementsByTagName('book'):
    print "<tr>"

    for item in ['author','title','publisher']:

        node = book.getElementsByTagName (item)[0]
        td( getText(node.childNodes) )

Das Snipplet gibt dann

Code: Alles auswählen


<tr>
<th>Autor(en)</th><th>Titel</th><th> Verlag</th>
</tr>
<tr>
<td>Mark Lutz</td> <td>Programming Python</td> <td>O'Reilley</td>
</tr>
<tr>
<td>C. Jones F. Drake, Jr.</td> <td>Python XML</td> <td>O'Reilley</td>
</tr>

Also ich denke getText (node) ist die Lösung. Kann ich aber nicht verifizieren da ich Deine XML net kenne

michael

Verfasst: Montag 10. Oktober 2005, 12:31
von abstract
THANXX
hier mal was ich so habe. das mit str(n) funktioniert nicht und getText() auch irgendwie nicht.
ich bräucht ne anweisung die mir den Inhalt des tags untersucht und je nachdem ne scene rausrendert.
also wenn walther, öffne scene, setlayer, und render raus.
und wenn xy öffne andere etc..


P.S. der blender code geht ! und das xml kann ich gestalten wie ich will !

Code: Alles auswählen

from xml.dom.ext.reader.Sax2 import FromXmlStream 

import sys
import Blender
from Blender import Scene

doc = FromXmlStream("c:/test.xml")

for element in doc.getElementsByTagName("name"):
    element.normalize()
    print "NAME: " + element.firstChild.data

  if getText(element.firstChild.data) == "Walther":

    scene = Blender.Load("C:/test.blend")
    sc=Scene.GetCurrent()
    sc.setLayers([2])
    sc.update()
    rc=sc.getRenderingContext()
    rc.renderAnim()
  
Edit (Leonidas): Code in Python-Tags gesetzt.

Re: If anweisung

Verfasst: Montag 10. Oktober 2005, 12:43
von jens
abstract hat geschrieben:also der Inhalt von n wird ausgegeben und das "TEST" nicht!

Code: Alles auswählen

    n=element.firstChild.data
    print n
    
    if n == "Walther":
        print "TEST"
Als das print n liefert "Walther" ??? dann mach doch noch ein print type(n) und ein print str(n)

auch ??

Verfasst: Montag 10. Oktober 2005, 12:53
von mbierenfeld
wenns nicht soviel ist gib mal bitte test.xml

Verfasst: Montag 10. Oktober 2005, 12:54
von abstract
ähhm also das print war nur zum testen. es geht um die if anweisung (siehe oben)

d.h. z.B. if n=="Walther": mach das und das, aber irgendwie gehts in dem kontext nicht obwohl sonstige if anweisungen gehen. überleg grad obs nicht am parsen liegt -> ob die daten im speicher gehalten werden ?!

Verfasst: Montag 10. Oktober 2005, 12:56
von abstract

Code: Alles auswählen

 
<?xml version="1.0" encoding="ISO-8859-1" ?> 
- <story>
- <owner>
  <gender>m</gender> 
  <surname>Guenther</surname> 
  <name>Walther</name> 
  <ID>0</ID> 
  </owner>
- <setting>
- <avatar>
  <a_name>Paul</a_name> 
  <a_gender>m</a_gender> 
  <hair>2</hair> 
  <wear>17</wear> 
  </avatar>
- <background>
- <picture>
  <url>stadium.jpg</url> 
  </picture>
  </background>
  <storymodel>standard</storymodel> 
  </setting>
  </story>

Verfasst: Montag 10. Oktober 2005, 12:57
von jens
abstract hat geschrieben:ähhm also das print war nur zum testen. es geht um die if anweisung (siehe oben)
Das ist schon klar :roll:

Es ist ja die Frage ob n wirklich das richtige liefert. So wie ich dich verstanden hab, hat print ja "Walther" ausgegeben, oder nicht?
Von daher scheint element.firstChild.data die richtigen Daten zu liefern.

Verfasst: Montag 10. Oktober 2005, 13:04
von abstract
ja nur der if vergleich geht nett also das "TEST" kommt net.

Verfasst: Montag 10. Oktober 2005, 13:05
von jens
und was brint ein print type(n) und ein print str(n) ???

Verfasst: Montag 10. Oktober 2005, 13:09
von abstract
also print type(n) gibt "unicode"
und
print str(n) gibt Walther

hängt es mit der unicode codierung und dem parsen zusammen !?

Verfasst: Montag 10. Oktober 2005, 13:14
von jens
Also bei mir geht's hiermit:

Code: Alles auswählen

from xml.dom.minidom import parse, parseString
doc = parse("test.xml")

for element in doc.getElementsByTagName("name"):
    element.normalize()
    print "NAME: " + element.firstChild.data
    print type(element.firstChild.data)

    if element.firstChild.data == "Walther":
        print "OK"
Die Ausgaben:

Code: Alles auswählen

NAME: Walther
<type 'unicode'>
OK

Verfasst: Montag 10. Oktober 2005, 13:16
von mbierenfeld
also das geht bei mir :

Code: Alles auswählen

from xml.dom.ext.reader.Sax2 import FromXmlStream

import sys

doc = FromXmlStream("test.xml")

for element in doc.getElementsByTagName("name"):
     element.normalize()

     data = element.firstChild.data
     print "NAME: " + data

     if data == "Walther":
         print "TEST"

Fragende Grüße. Ach ja getText schaut so aus :

Code: Alles auswählen


def getText(nodelist):
    lst = []

    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            lst.append(node.data)

    return ''.join(lst)

Michael

Verfasst: Montag 10. Oktober 2005, 13:22
von abstract
ich kotz gleich ! bei mir geht beides NET !

ich machs (mit SPE 0.7.3) auf und das "OK" und "TEST" kommen nicht

es geht nur wenn ich alles aus der xml lösche und nur

Code: Alles auswählen

<?xml version="1.0"?>
<name>Walther</name>
drin habe !!?

ich verstehe die fragenden grüße aber irgendwie ist hier bei mir irgendwas net in ordnung ! AAARRGGHHH[/code]