Pregunta

Estoy intentando leer un archivo XML en Python, tire de ciertos elementos del archivo XML y luego escribir los resultados a un archivo XML (así que básicamente es el archivo XML original sin varios elementos). Cuando uso .removeChild (fuente) que elimina los elementos individuales que desea eliminar, pero deja un espacio en blanco en su lugar haciendo que el archivo muy ilegible. Sé que todavía puedo analizar el archivo con todos los espacios en blanco, pero hay momentos en los que tengo que modificar manualmente los valores de los atributos de ciertos elementos y hace que sea difícil (y annyoing) para hacer esto. Ciertamente puedo eliminar el espacio en blanco con la mano, pero si tengo docenas de estos archivos XML que no es realmente factible.

¿Hay una manera de hacer .removeChild y tienen que eliminar el espacio en blanco así?

Esto es lo que mi código es el siguiente:

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

Gracias por la ayuda.

¿Fue útil?

Solución 2

No podía encontrar la manera de hacer esto utilizando xml.dom.minidom, por lo que acabo de escribir una función rápida para leer en el archivo de salida y eliminar todas las líneas en blanco y vuelva a grabar en un archivo nuevo:

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)

Esto funciona bastante bueno para mí:)

Otros consejos

Si tiene instalado PyXML puede utilizar xml.dom.ext.PrettyPrint ()

... para buscar PPL:

Este fragmento divertido

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

elimina todos los nodos de texto (y, también, revertir tipo ellos por tagname).

es decir. se puede (de forma recursiva) no tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] para eliminar todos los nodos de texto

O es posible que desee hacer algo como … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (nos't probar que uno mismo) si necesita nodos de texto con algunos datos. O algo más complejo para dejar el texto dentro de las etiquetas específicas.

Después de eso tree.toprettyxml(…) volverá texto XML bien formateado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top