2010-02-05 9 views
1

J'essaye de lire un fichier xml en python, d'extraire certains éléments du fichier xml, puis d'écrire les résultats dans un fichier xml (donc en gros c'est le fichier xml d'origine sans plusieurs éléments). Quand j'utilise .removeChild (source), il supprime les éléments individuels que je veux supprimer mais laisse un espace blanc à sa place rendant le fichier très illisible. Je sais que je peux toujours analyser le fichier avec tous les espaces, mais il y a des moments où j'ai besoin de modifier manuellement les valeurs des attributs de certains éléments et cela rend difficile (et annyoing) de le faire. Je peux certainement supprimer les espaces à la main, mais si j'ai des dizaines de ces fichiers xml, ce n'est pas vraiment faisable.Python xml.dom.minidom removeChild problème d'espaces blancs

Existe-t-il un moyen de faire .removeChild et de supprimer les espaces blancs?

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.

+1

comment écrivez-vous le fichier xml? 'Node.toxml()'? regardez 'Node.toprettyxml()' et 'Node.writexml()' –

+0

J'ai essayé de jouer avec toxml() et toprettyxml() et toujours le même problème d'avoir des blocs d'espace blanc où les éléments que j'ai enlevés étaient . Si je ne peux pas trouver de solutions en utilisant xml.dom.mini.dom, je suppose que je peux simplement utiliser python pour rechercher dans le document et supprimer toutes les lignes vides, bien que cela semble un peu bâclé pour moi. – Jamie

Répondre

1

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

1

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

1

... 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, inverser les trie par tagname).

à savoir vous pouvez (récursivement) faire 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 pourriez vouloir faire quelque chose comme … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (ne l'ai pas essayé moi-même) si vous avez besoin de nœuds de texte avec des données. Ou quelque chose de plus complexe pour laisser du texte à l'intérieur de tags spécifiques.

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

Questions connexes