1

xmlファイルをPythonに読み込み、xmlファイルから特定の要素を取り出して、結果をxmlファイルに書き戻そうとしています(基本的には、いくつかの要素を含まない元のxmlファイルです)。.removeChild(source)を使用すると、削除したい個々の要素が削除されますが、代わりに空白が残り、ファイルが非常に読みにくくなります。すべての空白を含むファイルをまだ解析できることはわかっていますが、特定の要素の属性の値を手動で変更する必要があり、これを行うのが困難(およびアニー)になる場合があります。私は確かに手で空白を削除することができますが、これらの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()

助けてくれてありがとう。

4

4 に答える 4

1

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)

これは私にとっては十分に機能します:)

于 2010-02-06T17:05:09.703 に答える
1

PyXMLがインストールされている場合は、xml.dom.ext.PrettyPrint()を使用できます。

于 2010-02-05T21:46:55.570 に答える
1

…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]つまり、すべてのテキストノードを削除するために(再帰的に)実行できます

または… if n.nodeType != n.TEXT_NODE or not re.match(r'^[:whitespace:]*$', n.data, re.MULTILINE)、データを含むテキストノードが必要な場合は、次のようなことを行うことをお勧めします(自分で試してみませんでした)。または、特定のタグ内にテキストを残すためのより複雑なもの。

その後、tree.toprettyxml(…)適切にフォーマットされたXMLテキストが返されます。

于 2010-09-12T16:44:45.203 に答える
0

私はこの質問がかなり古いことを知っていますが、問題へのさまざまなアプローチを理解するのに時間がかかったので、ここに私の解決策があります:

私が見つけた最良の方法は、確かにlxmlを使用することです。

from lxml import etree

root = etree.fromstring(data)
# for tag in root.iter('tag') doesn't cope with namespaces...
for tag in root.xpath('//*[local-name() = "tag"]'):
    tag.getparent().remove(tag)
data = etree.tostring(root, encoding = 'utf-8', pretty_print = True)

ミニダムでは、すべてのノードに末尾の空白ノードが付随しているという事実のために、もう少し複雑になります。

import xml.dom.minidom

dom = xml.dom.minidom.parseString(data)
for tag in dom.getElementsByTagName('tag'):
    if tag.nextSibling \
            and tag.nextSibling.nodeType == meta.TEXT_NODE \
            and tag.nextSibling.data.isspace():
        tag.parentNode.removeChild(tag.nextSibling)
    tag.parentNode.removeChild(tag)
data = dom.documentElement.toxml(encoding = 'utf-8')
于 2020-02-03T17:39:25.210 に答える