XML

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

Nö. XPath sei Dank, bekommen wir schon eine Liste, die wir leicht "joinen" können:

Code: Alles auswählen

In [12]: "".join(root.xpath("//titel/text()"))
Out[12]: '\nHalloWelt!. Du bist  schön!\n Und ich hoffe  so! '
(Parsing wie oben, `root` ist Wurzelelement.)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Da fehlte ein '/':

Code: Alles auswählen

In [412]: print ''.join(doc.xpath('titel//text()'))
HalloWelt!. Du bist so schön!
 Und ich hoffe  das bleibt  so!
@MarcelF6: Jetzt fängst Du an die Anforderungen zu ändern…
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:@Hyperion: Da fehlte ein '/':
Oops, stimmt. [ausredenmodus]Zu viel Ruby heute... :mrgreen: [/ausredenmodus]
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Hyperion: Ach, in Ruby funktioniert XPath anders? :-P
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Ok, ihr habt mich beide endgültig überzeugt! :)
Ist schon erschreckend (und zugleich erstaunlich), wie man 15 zeiligen Code in 2, 3 Zeilen abhandeln kann (und dann erst noch schneller und schöner).

Ich habs vorher bei mir auch rasch versucht - mit einer zu meiner Version alternativen Funktion:

Code: Alles auswählen

import lxml.etree as ET
doc = ET.parse("datasheet.xml")

def test(knoten):
  data = ET.tostring(doc)
  root = ET.fromstring(data)
  print ''.join(root.xpath(knoten+'//text()'))
Merkwürdigerweise wird aber immer (egal, was ich für 'knoten' einsetze) eine leere Zeile ausgegeben. Liegt das evtl. daran, dass ich die Datei zuerst parse?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Oha.. Dein Code ist ziemlich befremdlich! Hast Du Dich mal mit Funktionen (Parameterübergabe und Rückgabe) befasst? Du scheinst da enorme Wissenslücken zu haben.

Wieso übergibst Du den Elementnamen (`knoten` ist imho kein so passender Name dafür), aber nicht den Tree?

Und an das Wurzelelement kommt man so:

Code: Alles auswählen

root = tree.getroot()
Deine Methode ist ziemlich umständlich und ressourcenfressend (erst einen Tree in einen String wandeln, dann wieder den String parsen...)

Zeig uns doch mal bitte ein Beispiel, an dem wir Dein Problem nachvollziehen können...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten