我们有一个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
答案 0 :(得分:2)
如果您使用xml.elementtree
,则tree.write(file)
方法仅用 LF 替换 CRLF ,这在尝试导入时也会产生问题XML文件到 PyXB 。
我找到的解决方案是使用 ElementTree 来查找我必须替换的内容。然后我source_XML = 'new value'.join(source_XML.split('what you need to replace))
最后file.write(source_XML)
这不好,但它解决了这个问题。但是,我不介意缩进,所以对此我不能说。每当我需要打印时,我只会使用pprint.pprint()
。