提问人:Athena 提问时间:2/5/2023 最后编辑:mzjnAthena 更新时间:2/5/2023 访问量:57
在不影响命名空间声明的情况下向 XML 标记添加属性
Adding an attribute to an XML tag without affecting namespace declarations
问:
当属性丢失时,我正在尝试向 XML 字符串中的标记添加属性值,并打印出修改后的字符串。代码是我从各种来源粗略收集的拼凑而成的,所以如果这不是最佳实践,请深表歉意。
这是代码的样子 -
import xml.etree.ElementTree as ET
import time
xml_string = """
<message>
<info xmlns="urn:xmpp:info" />
</message>
"""
root = ET.fromstring(xml_string)
ns = {'ns': 'urn:xmpp:info'}
for info in root.findall(".//ns:info", ns):
sent_time = info.attrib.get("sent_time_millis")
if not sent_time:
sent_time = str(int(time.time() * 1000))
info.attrib["sent_time_millis"] = sent_time
print(ET.tostring(root, encoding='unicode'))
break
这会导致运行时出现类似这样的东西-
<message xmlns:ns0="urn:xmpp:info">
<ns0:info sent_time_millis="1675533312576" />
</message>
当所需的输出应该是这样的时-
<message>
<info xmlns="urn:xmpp:info" sent_time_millis="1675533086777" />
</message>
我敢肯定,我缺少一些基本的东西。我应该如何进行此修改?
谢谢。
答:
1赞
mzjn
2/5/2023
#1
ElementTree 以一种令人讨厌的方式摆弄命名空间(即使语义没有改变)。LXML 不这样做,因此解决方案是改用该库。
安装 lxml 并在代码中更改为 。import xml.etree.ElementTree as ET
from lxml import etree as ET
评论
info
urn:xmpp:info
sent_time_millis