Pergunta

Eu estou tentando ler um arquivo xml em python, puxe alguns elementos do arquivo XML e, em seguida, escrever os resultados de volta para um arquivo XML (por isso basicamente é o arquivo XML original sem vários elementos). Quando eu uso .removeChild (fonte) que remove os elementos individuais que deseja remover mas deixa espaço em branco em seu lugar, tornando o arquivo muito ilegível. Eu sei que ainda pode analisar o arquivo com todos os espaços em branco, mas há momentos em que eu preciso para alterar manualmente os valores dos atributos certa de elementos e torna-se difícil (e annyoing) para fazer isso. Eu certamente pode remover o espaço em branco à mão, mas se eu tiver dezenas desses arquivos XML que não é realmente viável.

Existe uma maneira de fazer .removeChild e tê-lo remover o espaço em branco também?

Aqui está o que minha aparência código como:

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

Muito obrigado pela ajuda.

Foi útil?

Solução 2

Eu não conseguia descobrir como fazer isso usando xml.dom.minidom, então eu só escrevi uma função rápido para ler o arquivo de saída e remover todas as linhas em branco e, em seguida, reescrever a um novo arquivo:

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)

Isso funciona suficientemente bom para mim:)

Outras dicas

Se você tem PyXML instalado, você pode usar xml.dom.ext.PrettyPrint ()

... para pesquisar ppl:

Este trecho engraçado

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

remove todos os nós de texto (e, também, os tipos revertê-las por tagname).

i. você pode (de forma recursiva) fazer tr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE] para remover todo o texto nós

Ou você pode querer fazer algo como … if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE) (tentativa did't que um eu mesmo) se você precisa o texto nós com alguns dados. Ou algo mais complexo para deixar o texto dentro de tags específicas.

Depois que tree.toprettyxml(…) retornará texto XML bem formatado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top