python - Wie schreibt man einen leeren Baumknoten als leeren String in eine XML-Datei?

Ich möchte Elemente eines bestimmten Tag-Werts entfernen und dann das @ ausschreib.xml Datei OHNE irgendwelche Tags für diese gelöschten Elemente; ist meine einzige Möglichkeit, einen neuen Baum zu erstellen?

Es gibt zwei Möglichkeiten, ein Element zu entfernen / löschen:

klar( Setzt ein Element zurück. Diese Funktion entfernt alle Unterelemente, löscht alle Attribute und setzt die Attribute text und tail auf None.

uerst habe ich das benutzt und es funktioniert zum Entfernen desDate aus dem Element, aber ich habe immer noch ein leeres Element:

# Remove all elements from the tree that are NOT "job" or "make" or "build" elements
log = open("debug.log", "w")
for el in root.iter(*):

    if el.tag != "job" and el.tag != "make" and el.tag != "build":
        print("removed = ", el.tag, el.attrib, file=log)
        el.clear()
    else:
        print("NOT", el.tag, el.attrib, file=log)

log.close()
tree.write("make_and_job_tree.xml", short_empty_elements=False)

Das Problem ist, dassxml.etree.ElementTree.ElementTree.write() schreibt immer noch leere Tags aus, egal was passiert:

... Der Parameter short_empty_elements (nur Schlüsselwort) steuert die Formatierung von Elementen, die keinen Inhalt enthalten. Wenn True (Standardeinstellung), werden sie als @ ausgegebesingle self-closed tag, sonst werden sie als @ ausgegebPaar Start- / End-Tags.

Warum gibt es keine Möglichkeit, diese leeren Tags nicht auszudrucken! Was auch immer

Also dann dachte ich, ich könnte versuchen,

remove (Unterelement) Entfernt das Unterelement aus dem Element. Im Gegensatz zu den find * -Methoden vergleicht diese Methode Elemente basierend auf der Instanzidentität, nicht auf dem Tag-Wert oder dem Inhalt.

Aber dies gilt nur für die untergeordneten Elemente.

So müsste icho etwas wie:

for el in root.iter(*):
    for subel in el:
        if subel.tag != "make" and subel.tag != "job" and subel.tag != "build":
            el.remove(subel)

Aber hier gibt es ein großes Problem: Ich mache den Iterator ungültig, indem ich Elemente entferne, richtig?

Reicht es aus, einfach zu prüfen, ob das Element leer ist, indem Sie @ hinzufügeif subel?:

if subel and subel.tag != "make" and subel.tag != "job" and subel.tag != "build"

Oder muss ich jedes Mal, wenn ich es ungültig mache, einen neuen Iterator für die Baumelemente erstellen?

Remember: Ich wollte nur die XML-Datei ohne Tags für die leeren Elemente ausschreiben.

Hier ist ein Beispiel.

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>

Angenommen, ich möchte alle Erwähnungen von @ entferneneighbor. Im Idealfall möchte ich diese Ausgabe nach dem Entfernen:

<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
    </country>
</data>

Problem, wenn ich den Code mit clear () ausführe (siehe ersten Codeblock oben) und ihn in eine Datei schreibe, erhalte ich Folgendes:

<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor></neighbor><neighbor></neighbor></country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor></neighbor></country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor></neighbor><neighbor></neighbor></country>
</data>

Beachtenneighbor wird immer noch angezeigt.

Ich weiß, ich könnte leicht einen regulären Ausdruck über die Ausgabe ausführen, aber es muss eine Möglichkeit (oder eine andere Python-API) geben, die dies im laufenden Betrieb ausführt, anstatt dass ich mein @ berühren mus.xml Datei erneut.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage