Seite 1 von 1

kleines Problem - bin zu doof oder so

Verfasst: Montag 16. Juni 2008, 19:02
von dor_neue
Bin zu doof für Python oder so...

Hab mich hier versucht:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import xml.dom.minidom

datei = open("tme.xml", "r")
dom = xml.dom.minidom.parse(datei)
datei.close()

def dokument(domina):
    sName = ""

    for node in domina.childNodes:

        if not node.nodeName == "#text":
            if not node.nodeName == "thermometer":
                sName = node.nodeName.strip()
                #print sName,

        if node.nodeType == node.TEXT_NODE:
            if not node.nodeValue.strip() == "":
                print sName, ": ", node.nodeValue.strip()

        dokument(node)

dokument(dom)

Die XML-Datei sieht folgender Maßen aus:

Code: Alles auswählen

<?xml version="1.0" encoding="ISO-8859-1"?>
<thermometer>
	<title>Ethernet thermometer- www.papouch.com</title>
	<description>INDOOR</description>
	<temperature>235</temperature>
	<mintemperature>"N"</mintemperature>
	<maxtemperature>"N"</maxtemperature>
</thermometer>

Also - Problem ist:

Das eine auskommentierte "print sName" zeigt mir den Namen richtig an wie es soll... Aber ich kann mir den Namen nicht in dem 2. großen if-Zweig anzeigen lassen - der kommt dort einfach nicht an und ich finde den Fehler nicht - PLS - seid so nett und sagt wo ich was vergessen habe - ich hänge jetzt schon seit (mit dem Anmeldemarathon hier im Board zusammen) über 3 Stunden dran...

THX @ all

Verfasst: Montag 16. Juni 2008, 19:09
von Hyperion
1.) Benutze bitte das Attribut "Python" in deinem Code-Blöcken

2.) Woher weißt Du, dass das print in der 2. großen If-Bedingung jemals angesprungen wird?

3.) Nimm statt minidom einfach ElemenTree http://docs.python.org/lib/module-xml.e ... tTree.html

Verfasst: Montag 16. Juni 2008, 19:38
von dor_neue
danke für die schnelle Antwort....

Also:

zu 1.) wie kann ich ein Atrribut dort setzen? Kurzes Code-Beispiel parat?
Und jetzt mal wirklich - ich hab gegooglt aber unter den Stichworten: 'Attribut "Python" Code-Blöcken' nix wirklich wahres gefunden - wonach könnte ich sonst noch suchen?!?

zu 2.) Er springt in die 2. If-Schleife, weil sonst würde er ja nicht die passende Ausgabe dazu machen - die sieht so aus:

Code: Alles auswählen

>>> 
title : Ethernet thermometer- www.papouch.com
description : INDOOR
temperature : 235
mintemperature : "N"
maxtemperature : "N"
>>>
 
zu 3.) WOW - warum das? Ich hab doch theoretisch eine Funktion die läuft - warum sollte ich die jetzt ändern? Was bringt die für Vorteile?


Wie gesagt, dank Dir für die schnelle Hilfe...

Verfasst: Montag 16. Juni 2008, 20:06
von Mr. Kanister
Hallo dor_neue,

du musst, wenn du einen Beitrag verfasst da wo "Kein (Nur-Text)" steht "Python" auswählen. ;)

Gruß Martin

Verfasst: Montag 16. Juni 2008, 20:19
von dor_neue
boar - bin ich echt so doof?!?

Ich hab 0 Ahnung wo Du meinst...
Ich arbeite mit der IDE PyScripter 1.9.9.2 - is es da vielleicht anders?

Außerdem hab ich WinXP und Python in der Version 2.5.2

Klingt vielleicht doof, aber kannste nen Screenshot davon machen was Du meinst?!? Dann hab ich ich ne Chance das zu verstehen - kA ich steh heute voll auf dem Schlauch...

Thx Euch schon mal im Voraus...

Verfasst: Montag 16. Juni 2008, 20:30
von Mr. Kanister
dor_neue hat geschrieben:boar - bin ich echt so doof?!?

Ich hab 0 Ahnung wo Du meinst...
Ich arbeite mit der IDE PyScripter 1.9.9.2 - is es da vielleicht anders?

Außerdem hab ich WinXP und Python in der Version 2.5.2

Klingt vielleicht doof, aber kannste nen Screenshot davon machen was Du meinst?!? Dann hab ich ich ne Chance das zu verstehen - kA ich steh heute voll auf dem Schlauch...

Thx Euch schon mal im Voraus...
Ich glaube du weiß nicht worauf wir hinaus wollen!?

Das Forensystem hier unterstützt Syntax-Highlighting. Das bedeutet, dass du den Code in den Code-Blöcken, die du hier einfügst farbig hervorheben kannst.

Du kannst dabei verschiedenen Sprachen auswählen, so natürlich auch Python. Die Option dazu findest du, wenn du eine neue Antwort schreibst unter dem Button für Fettschrift (B).

Dein Code Beispiel aus dem Anfangspost sähe damit so aus:

Code: Alles auswählen

#!/usr/bin/python
# -*- coding: utf-8 -*-

import xml.dom.minidom

datei = open("tme.xml", "r")
dom = xml.dom.minidom.parse(datei)
datei.close()

def dokument(domina):
    sName = ""

    for node in domina.childNodes:

        if not node.nodeName == "#text":
            if not node.nodeName == "thermometer":
                sName = node.nodeName.strip()
                #print sName,

        if node.nodeType == node.TEXT_NODE:
            if not node.nodeValue.strip() == "":
                print sName, ": ", node.nodeValue.strip()

        dokument(node)

dokument(dom)
Gruß Martin

Verfasst: Montag 16. Juni 2008, 20:54
von Hyperion
dor_neue hat geschrieben: zu 2.) Er springt in die 2. If-Schleife, weil sonst würde er ja nicht die passende Ausgabe dazu machen - die sieht so aus:

Code: Alles auswählen

>>> 
title : Ethernet thermometer- www.papouch.com
description : INDOOR
temperature : 235
mintemperature : "N"
maxtemperature : "N"
>>>
 
Dann verstehe ich dein Problem ehrlich gesagt nicht?
zu 3.) WOW - warum das? Ich hab doch theoretisch eine Funktion die läuft - warum sollte ich die jetzt ändern? Was bringt die für Vorteile?
Musst Du auch nicht. Ich persönlich mag ElementTree irgend wie lieber. Ist nicht so DOM-uralt ;-)

Verfasst: Montag 16. Juni 2008, 21:06
von dor_neue
Also so wie oben der Code ist kommt folgende Ausgabe:

Code: Alles auswählen

>>>
 : Ethernet thermometer- www.papouch.com
 : INDOOR
 : 235
 : "N"
 : "N"
>>>
Wenn ich das auskommentierte print sName wieder rein nehme, dann schreibt er die Beschreibung wieder mit..

Er vergisst auf dem Weg von der ersten If-Anweisung in die 2. If-Anweisung wie der Wert von sName ist - und ich versteh nicht warum...

is doch ne Var die die gesamte Funktion gilt - oder?! Damit kann ich diese 1. aus der gesamten Funktion beschreiben und 2. aus der gesamten Funktion abfragen - so ist es z.B. in c

Aber Python mag das nicht so hab ich das Gefühl - muss ich da speziell noch nen Attribut für die Variable setzen? Deklarieren is ja in Python nicht, oder shee ich das falsch?!?

PS: Jetzt hab ich das mit dem Code-Syntax-Highlighting verstanden - hab echt nicht gewusst wie Ihr das gemeint habt...

Das nächste mal dann...

Verfasst: Montag 16. Juni 2008, 21:24
von BlackJack
Python verhält sich hier genau wie C -- `sName` ist eine lokale Variable, die es in jedem Aufruf "neu" gibt. Du rufst die Funktion ja rekursiv auf, und da hast Du natürlich keinen Zugriff auf das lokale `sName` vom Aufruf "darüber".

Ich würde auch ElementTree empfehlen. Dessen API ist IMHO angenehmer zu benutzen.

Verfasst: Montag 16. Juni 2008, 22:57
von snafu
dor_neue hat geschrieben:Also so wie oben der Code ist kommt folgende Ausgabe:

Code: Alles auswählen

>>>
 : Ethernet thermometer- www.papouch.com
 : INDOOR
 : 235
 : "N"
 : "N"
>>>
Wenn ich das auskommentierte print sName wieder rein nehme, dann schreibt er die Beschreibung wieder mit..
Ich verstehe dann gerade dein Problem nicht. Er schreibt es doch mit wenn du dein sName wieder mit reinnimmst. Was willst du denn damit erreichen, dass sName im zweiten if-Block vorkommt?

Und wenn wir schon bei alternativen Parsern sind, hau ich auch mal meinen Lösungweg raus. :P

Code: Alles auswählen

from __future__ import with_statement
from BeautifulSoup import BeautifulSoup

with open('tme.xml') as f:
    content = f.read()

soup = BeautifulSoup(content)

data = soup.thermometer.contents

for newline in data:
    data.remove(newline) # klappt aber nur weil sie an der "richtigen" Stelle sind
                         # sonst: if '\n' in element...
for element in data:
    print '%s : %s' % (element.name, element.contents[0])
//edit: Falls du die Werte weiterverwenden willst:

Code: Alles auswählen

names = [element.name for element in data]

contents = [element.contents[0] for element in data]

for name, content in izip(names, contents):
    print '%s : %s' % (name, content)