Domanda

Sto cercando di leggere un file XML in python, tirare fuori alcuni elementi dal file XML e quindi scrivere i risultati di nuovo in un file XML (in modo sostanzialmente è il file XML originale senza diversi elementi). Quando uso .removeChild (sorgente) rimuove i singoli elementi che voglio per rimuovere, ma lascia spazio bianco in sua vece rendere il file molto illeggibile. So che posso ancora analizzare il file con tutti gli spazi bianchi, ma ci sono momenti in cui ho bisogno di modificare manualmente i valori degli attributi certa dell'elemento e rende difficile (e annyoing) per fare questo. Posso certamente rimuovere lo spazio vuoto a mano, ma se ho decine di questi file XML che non è proprio fattibile.

C'è un modo per farlo .removeChild e farlo rimuovere lo spazio bianco come bene?

Ecco quello che il mio codice è simile:

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()

Grazie mille per l'aiuto.

È stato utile?

Soluzione 2

Non riuscivo a capire come fare questo usando xml.dom.minidom, quindi ho solo scritto una funzione rapida per leggere nel file di output e rimuovere tutte le righe vuote e poi riscrivere in un nuovo file:

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)

Questo funziona abbastanza buono per me:)

Altri suggerimenti

Se avete PyXML installato è possibile utilizzare xml.dom.ext.PrettyPrint ()

... per la ricerca ppl:

Questa divertente frammento

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)))

rimuove tutti i nodi di testo (e, anche, specie invertire loro da nometag).

vale a dire. è possibile (in modo ricorsivo) non tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] per rimuovere tutti i nodi di testo

In alternativa si potrebbe desiderare di fare qualcosa di simile … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (did't provare che uno io) se avete bisogno di nodi di testo con alcuni dati. O qualcosa di più complesso di lasciare testo all'interno di tag specifici.

Dopo che tree.toprettyxml(…) tornerà testo XML ben formattato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top