python-3.x 向XML标记添加属性而不影响命名空间声明

42fyovps  于 2023-02-06  发布在  Python
关注(0)|答案(1)|浏览(155)

我尝试在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>

我肯定我漏掉了一些基本的东西.我该怎么做这个修改呢?
谢谢。

7uzetpgm

7uzetpgm1#

ElementTree以一种令人讨厌的方式摆弄名称空间(即使语义没有改变)。lxml不这样做,因此解决方案是使用该库。
安装lxml并在代码中将import xml.etree.ElementTree as ET更改为from lxml import etree as ET

相关问题