Pythonのxml.dom.minidomでは空白問題をREMOVECHILD
-
18-09-2019 - |
質問
私は(そう基本的に、それはいくつかの要素なしで、元のXMLファイルです)、パイソンにxmlファイルを読み込むXMLファイルから特定の要素を引き出した後、バックxmlファイルに結果を書き込むしようとしています。私は.removeChild(ソース)を使用するとき、それは私が削除する個々の要素を削除しますが、ファイルは非常に読めなくなって、その代わりに空白を残します。私はまだ空白のすべてのファイルを解析することができます知っているが、私は手動で特定の要素の属性の値を変更する必要がございます、それはそれは難しい(とannyoing)これを実行することができます。私は本当に実現可能ではありませんこれらのXMLファイルの数十を持っている場合、私は確かに手で空白を除去するが、ことができます。
.removeChildを行うと、それは同様の空白を削除持っている方法はありますか?
ここに私のコードは次のようになります。
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()
の助けを本当にありがとうございました。
解決 2
私はxml.dom.minidomではを使用して、これを行う方法を見つけ出すことができなかったので、私はちょうど、出力ファイルを読み込み、すべての空白行を削除し、新しいファイルに書き換えることが迅速な機能を書いてます:
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)
これは私のために十分に機能します)。
他のヒント
あなたはxml.dom.ext.PrettyPrint()
を使用することができます... PPLを検索する:
この面白いスニペット
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)))
すべてのテキストノード(及び、また、逆にタグ名でソートします)を削除します。
すなわち。あなたは(再帰的に)すべてのテキストノードを削除するtr.childNodes = [recurseclean(n) for n in tr.childNodes if n.nodeType != n.TEXT_NODE]
くださいすることができます。
それとも、いくつかのデータとテキストノードが必要な場合には、(1つを自分自身を試してみてくださいdid't)… if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE)
ような何かをしたい場合があります。または特定のタグ内のテキストを残して、より複雑な何かます。
そのtree.toprettyxml(…)
した後、よくフォーマットされたXMLテキストを返します。