我正在尝试打开一个有效的xml文件,用lxml-xml
对其进行解析,对其进行美化,最后将其保存到其他文件中。
我的代码如下:
def main(path_to_config):
with open(f'configs/{path_to_config}', 'r') as file:
contents = file.read()
soup = BeautifulSoup(contents, 'xml')
with open(f'pretty_xml/{path_to_config.split("_")[0]}.xml', 'w') as new_file:
new_file.write(soup.prettify())
不幸的是,无论文件中放入什么内容,解析都不会生成有效的xml。单行<?xml version="1.0" encoding="utf-8"?>
已保存到pretty_config/
文件中。我已经通过多个在线验证器验证了我传递的xml是有效的。
我尝试仅用文件代替file.read()
,但是没有运气。我还尝试过仅用xml字符串替换它,该字符串可以工作并验证我的解析器是否正常工作,并且在打开文件并将内容传递给BeautifulSoup
之间发生了故障。
任何对此的帮助将不胜感激。
更新:
我的xml文件只有一行<note><time>twelve</time></note>
。
作为健全性检查,我添加了assert contents == '<note><time>twelve</time></note>'
,因为当我将字符串传递给BeautifulSoup
时解析器没有问题。这一新行引发了AssertionError
,我对此一无所知。字符串应该不一样吗?我直接将.py文件中的字符串复制到.xml文件中,没有其他空格或任何其他字符。
答案 0 :(得分:1)
我的文件开头有一个BOM,但是从.py文件到.xml文件的复制粘贴并未覆盖它。
由于@snakecharmerb的建议使用repr(contents)
查看我的字符串的真实表示,我发现了这一点,并发现值是'\'\\ufeff<note><time>twelve</time></note>\''
。 \ ufeff是BOM,需要删除。
我在函数的开头添加了以下几行,它可以修复错误。
s = open(f'configs/{path_to_config}', mode='r', encoding='utf-8-sig').read()
open(f'configs/{path_to_config}', mode='w', encoding='utf-8').write(s)