Seite 3 von 3

Re: XML

Verfasst: Sonntag 13. Mai 2012, 19:32
von Hyperion
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.)

Re: XML

Verfasst: Sonntag 13. Mai 2012, 19:38
von 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…

Re: XML

Verfasst: Sonntag 13. Mai 2012, 19:42
von Hyperion
BlackJack hat geschrieben:@Hyperion: Da fehlte ein '/':
Oops, stimmt. [ausredenmodus]Zu viel Ruby heute... :mrgreen: [/ausredenmodus]

Re: XML

Verfasst: Sonntag 13. Mai 2012, 19:55
von BlackJack
@Hyperion: Ach, in Ruby funktioniert XPath anders? :-P

Re: XML

Verfasst: Sonntag 13. Mai 2012, 20:29
von MarcelF6
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?

Re: XML

Verfasst: Sonntag 13. Mai 2012, 20:50
von Hyperion
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...