Question

Je suis en train de lire un fichier xml en python, retirer certains éléments du fichier xml, puis d'écrire les résultats à un fichier xml (donc en gros il est le fichier XML d'origine sans plusieurs éléments). Lorsque j'utilise .removeChild (source), il supprime les éléments individuels que je veux enlever, mais laisse un espace blanc à sa place rendant le fichier très illisible. Je sais que je peux encore analyser le fichier avec tous les espaces, mais il y a des moments où j'ai besoin de modifier manuellement les valeurs de certains attributs de l'élément et il est difficile (et annyoing) pour ce faire. Je peux certainement supprimer l'espace à la main, mais si j'ai des dizaines de ces fichiers XML qui n'est pas vraiment possible.

Y at-il un moyen de faire .removeChild et l'ont enlever l'espace blanc ainsi?

Voici ce que mon code ressemble à:

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

Merci beaucoup pour l'aide.

Était-ce utile?

La solution 2

Je ne pouvais pas comprendre comment faire en utilisant xml.dom.minidom, donc je viens d'écrire une fonction rapide à lire dans le fichier de sortie et supprimer toutes les lignes vides puis réécrire dans un nouveau fichier:

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)

Cela fonctionne assez bien pour moi:)

Autres conseils

Si vous avez PyXML installé, vous pouvez utiliser xml.dom.ext.PrettyPrint ()

... pour ppl recherche:

Cet extrait drôle

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

supprime tous les nœuds de texte (et, aussi, sortes inverse les par tagname).

i.e.. vous pouvez (récursive) ne tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] pour supprimer tous les nœuds de texte

Ou vous voudrez peut-être faire quelque chose comme … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (essayez did't que moi-même) si vous avez besoin nœuds de texte avec des données. Ou quelque chose de plus complexe pour laisser texte à l'intérieur des balises spécifiques.

Après que tree.toprettyxml(…) retournera texte XML bien formaté.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top