4

変更したいタグを含む XML ドキュメントがあります。

...<version>1.0</version>...

これは XML ファイルの奥深くに埋め込まれていますが、Beautiful Soup を使用してその内容をコマンド ライン パラメーターに置き換えることに成功しています。

問題は、ツリーを変更した後、読み込んだファイルに書き戻す必要があることです。ただし、ドキュメントの元の書式を維持したいと考えています。私が使用する場合:

fileForWriting = open(myXmlFile, 'w')
fileForWriting.write(soup.prettify())

prettify()呼び出しはフォーマットを壊し、私は次のようになります:

<version>
 1.0
</version>

その単一のタグ テキストを置き換えながら、XML ドキュメントの元の書式を維持する方法はありますか?

注:単純に次のように使用します。

fileForWriting.write(str(soup))

テキストとタグを同じ行に保持しますが、読みやすくするために人間が追加したインデントと余分な改行を削除します。閉じますが、葉巻はありません。

リクエストにより、スクリプト全体:

from BeautifulSoup import BeautifulSoup as bs

import sys

xmlFile = sys.argv[1:][0]
version = sys.argv[1:][1]

fileForReading = open(xmlFile, 'r')
xmlString = fileForReading.read()
fileForReading.close()

soup = bs(xmlString)

soup.findAll('version')[1].contents[0].replaceWith(version)

fileForWriting = open(xmlFile, 'w')
fileForWriting.write(str(soup))
fileForWriting.close()

次に、スクリプトは次を使用して実行されます。

python myscript.py someFile.xml 1.2

4

1 に答える 1

2

また、を使用する場合xml.elementtree、このtree.write(file)メソッドはCRLFLFのみに置き換えます。これにより、XMLファイルをPyXBにインポートしようとしたときにも問題が発生します。

私が見つけた解決策は、交換する必要があるものを見つけるためだけにElementTreeを使用することです。それから私はsource_XML = 'new value'.join(source_XML.split('what you need to replace))最後にfile.write(source_XML)

それは良くありませんが、それは問題を解決します。ただ、くぼみは気にしないので、これについてはあまり言えません。pprint.pprint()印刷する必要があるときだけ使用します。

于 2012-10-17T18:47:20.503 に答える