kleines Problem - bin zu doof oder so

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
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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...
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

Hallo dor_neue,

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

Gruß Martin
LINUX - May the source be with you!
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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...
Mr. Kanister
User
Beiträge: 11
Registriert: Montag 16. Juni 2008, 16:45
Wohnort: Bedburg

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
LINUX - May the source be with you!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
dor_neue
User
Beiträge: 74
Registriert: Montag 16. Juni 2008, 18:51

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...
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.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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)
Antworten