Frage

Ich versuche, eine XML-Datei in Python zu lesen, bestimmte Elemente aus der XML-Datei herausziehen und dann die Ergebnisse in eine XML-Datei schreiben zurück (also im Grunde ist es die ursprüngliche XML-Datei ohne mehrere Elemente). Als ich .removeChild (Quelle) verwenden entfernt es die einzelnen Elemente, die ich entfernen möchten Blätter aber Leerraum an seiner Stelle sehr unleserlich die Datei zu machen. Ich weiß, ich kann immer noch die Datei mit all den Leerzeichen analysieren, aber es gibt Zeiten, wenn ich brauche, um manuell die Werte bestimmten Elements Attribute zu ändern und es macht es schwierig (und annyoing), dies zu tun. Ich kann auf jeden Fall die Leer von Hand entfernen, aber wenn ich Dutzende dieser XML-Dateien haben das ist nicht wirklich machbar ist.

Gibt es eine Möglichkeit .removeChild zu tun und hat es auch den weißen Raum entfernen?

Hier ist, was mein Code wie folgt aussieht:

dom=parse(filename)
main=dom.childNodes[0]
sources = main.getElementsByTagName("source")
for source in sources :
    name=source.getAttribute("name")
    spatialModel=source.getElementsByTagName("spatialModel")
    val1=float(spatialModel[0].getElementsByTagName("parameter")[0].getAttribute("value"))
    val2=float(spatialModel[0].getElementsByTagName("parameter")[1].getAttribute("value"))
    if angsep(val1,val2,X,Y)>=ROI :
        main.removeChild(source)
    else:
        print name,val1,val2,angsep(val1,val2,X,Y)
f=open(outfile,"write")
f.write("<?xml version=\"1.0\" ?>\n")
f.write(dom.saveXML(main))
f.close()

Vielen Dank für die Hilfe.

War es hilfreich?

Lösung 2

Ich konnte nicht herausfinden, wie dies mit xml.dom.minidom zu tun, also schrieb ich nur eine schnelle Funktion in der Ausgabedatei zu lesen und alle Leerzeilen entfernen, und dann in eine neue Datei neu zu schreiben:

f = open(xmlfile).readlines()
w = open('src_model.xml','w')
empty=re.compile('^$')
for line in open(xmlfile).readlines():
    if empty.match(line):
        continue
    else: 
        w.write(line)

Das funktioniert gut genug für mich:)

Andere Tipps

Wenn Sie PyXML installieren Sie xml.dom.ext.PrettyPrint verwenden können ()

... für die Suche ppl:

Dieser lustige Schnipsel

skey = lambda x: getattr(x, "tagName", None)
mainnode.childNodes = sorted( 
  [n for n in mainnode.childNodes if n.nodeType != n.TEXT_NODE],
  cmp=lambda x, y: cmp(skey(y), skey(x)))

entfernt alle Textknoten (und auch umgekehrt sortiert sie nach tagname).

d. Sie können (rekursiv) do tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] alle Textknoten entfernen

Oder Sie könnten so etwas wie … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) tun wollen (did't versuchen, dass man selbst), wenn Sie Textknoten mit einigen Daten benötigen. Oder etwas komplexer zu verlassen Text in bestimmten Tags.

Danach tree.toprettyxml(…) kehrt gut formatierte XML-Text.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top