So entfernen Sie Elemente aus XML mit Python

8

Ich habe mit XML und Python festgefahren. Die Aufgabe ist einfach, aber ich konnte es bisher nicht lösen und verbrachte so lange Zeit damit. Ich kam hierher, um einen Rat zu bekommen, wie ich es mit ein paar Zeilen lösen kann.

Danke für jede Hilfe beim Durchqueren des Baumes. Ich habe immer zu viele oder zu wenige Elemente bekommen. Elemente können unbegrenzt verschachtelt werden. Ein gegebenes Beispiel ist nur ein Beispiel. Ich werde jede Lösung akzeptieren, nicht wählerisch über Dom, Minidom, Saxophon, was auch immer ..

Ich habe eine ähnliche XML-Datei wie diese:

%Vor%

Was ich brauche - parse das XML und schreibe eine neue Datei. Die neue Datei sollte alle Elemente für die angegebene Sprache und Elemente ohne lang -Attribut enthalten.

Für die Sprache "cs" sollte die Ausgabedatei folgendes enthalten:

%Vor%

Wenn Sie es schaffen, das lang -Attribut in der neuen Datei wegzulassen, sogar noch besser. Aber das ist nicht so wichtig.

UPDATE1: Unicode-Zeichen und Namespace-Attribut hinzugefügt.

UPDATE2: Unter Verwendung von Python 2.5 sind Standardbibliotheken bevorzugt.

    
dwich 29.08.2010, 01:38
quelle

3 Antworten

10

Verwenden Sie lxml :

%Vor%

ergibt

%Vor%     
unutbu 29.08.2010, 02:18
quelle
5

Ich bin mir nicht sicher, wie man das lang -Attribut am besten entfernen kann, aber hier ist ein Code, der die anderen Änderungen ausführt (Python 2.7; für 2.5 oder 2.6 getIterator anstelle von iter verwenden) Wenn Sie ein Element entfernen, möchten Sie immer auch alles entfernen, was in diesem Element enthalten ist.

Dieser Code druckt das Ergebnis nur auf die Standardausgabe (Sie können es natürlich beliebig umleiten oder direkt in eine neue Datei schreiben):

%Vor%

Wenn la.xml Ihr Beispiel ist, schreibt dies

%Vor%     
Alex Martelli 29.08.2010 02:10
quelle
1

Aktualisierung @Alex Martellis Code, um einen Fehler zu entfernen, wo die Elementliste an Ort und Stelle aktualisiert wird. Die obige Lösung liefert eine falsche Antwort, wenn die Eingabe etwas komplexer ist.

%Vor%

Der Code in Zeile 7 for subelement in element: wird in for subelement in element[:]: geändert, da es nicht korrekt ist, die Liste während des Iterierens zu aktualisieren.

Dieser Code iteriert über eine Kopie der Elementliste und entfernt Elemente, wenn lang!="en" in der ursprünglichen Elementliste steht.

    
bhuvi 17.11.2015 19:27
quelle

Tags und Links