lxml kann mit Kommentaren in XML Datei nicht umgehen

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
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich wollte gerade Kommentare in meine XML Datei einfügen. lxml bricht dann beim Einlesen aber an der Stelle ab. Kann es sein, dass lxml nicht mit Kommentaren umgehen kann?

Oder braucht man für lxml eine andere Kommentarform? Ich habe die üblichen <!-- --> Kommentare verwendet
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

burli hat geschrieben:Ich wollte gerade Kommentare in meine XML Datei einfügen. lxml bricht dann beim Einlesen aber an der Stelle ab. Kann es sein, dass lxml nicht mit Kommentaren umgehen kann?
Wie ist denn der genaue Fehler? Gib doch mal ein kleines Minimalbeispiel von Code und XML, bei dem das Problem auftritt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Funktioniert bei mir prächtig.

Code: Alles auswählen

>>> from lxml.etree import fromstring
>>> tree = fromstring('<root><nodeA>a</nodeA><!-- comment --><nodeB>b</nodeB></root>')
>>> tree.getchildren()
[<Element nodeA at 86c4f04>, <!-- comment -->, <Element nodeB at 86c4a54>]
>>> type(tree.getchildren()[1])
<type 'lxml.etree._Comment'>
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich hab das Problem früher schonmal gehabt. Hier mal die aktuelle Fehlermeldung
Import Article
<!-- This is a coment -->
Traceback (most recent call last):
File "test.py", line 53, in <module>
import_articles_from_xml()
File "/home/burli/dev/flask/shop1/shop/model/functions.py", line 101, in import_articles_from_xml
taglist = child.attrib['tags'].split('+')
KeyError: 'tags'

Code: Alles auswählen

<?xml version="1.0"?>
<ARTICLES>
    <!-- This is a coment -->
    <article artno="472" match="ATmega8-16PU" tags="Mikrocontroller + Atmel + AVR + megaAVR + ATmega8 + Controller +
        8k Byte + 1024 Byte RAM + 512 Byte EEPROM + 1x USART + 6x 10 Bit ADC + 1x TWI + 1x SPI + 2x 8 Bit Timer + 1x 16 Bit Timer + 4,5-5,5V + DIP + 28 Pins" />

[...]
</ARTICLES>
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Hm, ich sehe gerade, dass Problem scheint eher die Weiterverarbeitung zu sein und weniger der Import selbst. Aber was will ich mit Kommentaren im XML Tree?
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was hat denn der Kommentar damit zu tun? Das Element "child" wird einfach nicht dem Tag "<article>" entsprechen. Daher rennt der Zugriff auf attribs["tags"] in einen Fehler.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Ich bin davon ausgegangen, dass Kommentare schon beim Einlesen des XML Tree eliminiert werden
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
lunar

@burli: Wieso sollten sie?! Kommentare sind schließlich Teil des Dokuments wie alle anderen Knoten auch, und man möchte im Allgemeinen auch nicht, dass Kommentare verloren gehen, wenn man geänderte Dokumente wieder serialisiert.

Du kannst Dich bei XML-Dokumenten halt einfach nicht darauf verlassen, dass die Knoten in einer bestimmten Reihenfolge vorliegen. Letztlich können da beliebige Knoten vorkommen, selbst wenn man das Dokument vorher validiert. Insofern musst Du schon explizit beschreiben, welchen Kindknoten Du möchtest, und darfst nicht einfach per Indexzugriff den x-ten Knoten ansprechen.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Es gibt nur eine Sorte Knoten in meinen XML Dokumenten. Von daher kann ich da sicher sein. Dann muss ich Kommentare vorher von Hand filtern
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
BlackJack

@burli: Du kannst nicht sicher sein, wie man an den Kommentaren sieht. Es gibt da ja auch noch anderes -- zum Beispiel "processing instructions" oder auch andere Knoten mit Namensräumen. Warum schreibst Du nicht einfach ein sauberes, robustes Programm?

Die Überschrift ist falsch -- es ist nicht `lxml` was mit Kommentaren nicht umgehen kann, sondern Dein Programm kommt mit gültigen XML-Dokumenten nicht klar. Da sollte man nicht das XML einschränken, sondern das Programm korrigieren. Zumal das ja auch ziemlich einfach ist.
burli
User
Beiträge: 1156
Registriert: Dienstag 9. März 2004, 18:22

Das XML Dokument erstelle ich selbst und ich wollte die Kommentare nur der Übersichtlichkeit wegen einfügen. Ich bin halt davon ausgegangen, dass Kommentare "ausgesiebt" werden, bevor ich die Daten bekomme.
Das schwierigste beim Programmieren ist, sinnvolle Variablen- und Funktionsnamen zu finden :lol:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie lunar schon gesagt hat wäre das ja ziemlicher Quatsch, auch weil das einigen Probleme bereiten würde. Wenn Kommentare im Tree sind, dann kann man sie ignorieren, wenn sie nicht sind, kann man sie nur sehr schwer da wieder einfügen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Ich bin an dem Verhalten vorher auch noch nicht vorbei gekommen. Die Suche nach "lxml.etree comments" hat mich sofort zum Tutorial geführt, wo genau beschrieben ist wie man mit den Unterschielichen node types umgehen muss und wie man diese filtern kann.

http://codespeak.net/lxml/tutorial.html#tree-iteration
Antworten