【发布时间】:2021-10-22 22:29:10
【问题描述】:
我正在尝试使用 Python 的 xml.etree.ElementTree 将 XML 树写入磁盘,以重现给我的示例文档。目标 XML 文档中的字段如下所示:
<title>
This is a test of <br/> Hershey's <sup>&$174;</sup> chocolate factory machine <br/>
</title>
我的问题是,每当我尝试使用 ElementTree 的 .write() 方法将文本写入磁盘时,我都无法实现上述输出。 html 标签将被转换为&lt;br&gt;,或者商标符号(® 的东西)将显示为实际符号。有没有办法对我的文本进行编码以获得上述输出(其中商标由 ® 字符表示,但 html 是 html?)。我在 write 方法中尝试了不同的编码选项,但似乎没有任何效果。
编辑:这是一个最小的工作示例。获取一个输入 XML 模板文件,如:
<?xml version='1.0' encoding='UTF-8'?>
<document>
<title> Text to replace </title>
</document>
我们尝试像这样修改文本
import xml.etree.ElementTree as ET
tree = ET.parse('example.xml')
root = tree.getroot()
to_sub_text = "This is a test of <br/> Hershey's <sup>&$174;</sup> chocolate factory machine"
spot = root.find('title')
spot.text = to_sub_text
tree.write('example_mod.xml', encoding='UTF-8', xml_declaration=True)
这将写入文件:
<?xml version='1.0' encoding='UTF-8'?>
<document>
<title>This is a test of <br/> Hershey's <sup>&$174;</sup> chocolate factory machine</title>
</document>
正如我所说,我试图复制的文档将这些 html 标签作为标签。我的问题是:
- 我可以修改我的代码来做到这一点吗?
- 是否正在做这种良好的做法,还是保持现状更好(因此我需要与团队交谈,要求我以这种方式提供给他们)?
【问题讨论】:
-
1) 请向我们展示您的代码。 2) "® stuff" 应该是这样的:
&#174;(带有#和;)。 -
谢谢。当我第一次发布时,我应该包含一个完整的示例。见上文。
-
&$174;应该是&#174;。 -
“html 标签将被转换为 <br>” - 当您将文本保存到 XML 文档时会发生这种情况。它将进行 XML 转义。文本偶然也是HTML源代码也无所谓。文字就是文字。如果要将实际节点的子树保存到 XML 元素,则需要创建它们。你不能做
spot.text = 'a string with a couple of angle brackets'期望得到与spot.text = 'literally any other string'不同的待遇。 -
“或商标符号(将显示为实际符号。” - 是的。那又如何?XML 文件的工作是传输 字符(商标符号),不要保留您最喜欢的表示形式。
&#xae;、&#174;和®都表示相同的东西。从编写文件时的 XML 文档的角度来看 - 为什么使用6 个字符 (&#174;) 什么时候可以用一个 (®)?
标签: python-3.x xml character-encoding elementtree