在不影响命名空间声明的情况下向 XML 标记添加属性

Adding an attribute to an XML tag without affecting namespace declarations

提问人:Athena 提问时间:2/5/2023 最后编辑:mzjnAthena 更新时间:2/5/2023 访问量:57

问:

当属性丢失时,我正在尝试向 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>

我敢肯定,我缺少一些基本的东西。我应该如何进行此修改?

谢谢。

python-3.x xml 解析 elementtree xml-namespaces

评论

1赞 larsks 2/5/2023
这两个 XML 文档是 100% 等效的。它们都导致命名空间中的元素具有该属性。infourn:xmpp:infosent_time_millis
0赞 Athena 2/5/2023
我试图把它 100% 一对一地用于 char - 我们目前的设置真的很挑剔,即使与预期值的轻微偏差也会让整个系统陷入困境,我无法真正测试这在我们的前端是什么样子的。很抱歉这听起来很愚蠢。
1赞 mzjn 2/5/2023
如果您使用 lxml 而不是 ElementTree,您将获得所需的输出。相关问题:stackoverflow.com/q/45990761/407651
0赞 Athena 2/5/2023
这适用于我的用例 - 您想回答问题以便我可以将其标记为@mzjn吗?

答:

1赞 mzjn 2/5/2023 #1

ElementTree 以一种令人讨厌的方式摆弄命名空间(即使语义没有改变)。LXML 不这样做,因此解决方案是改用该库。

安装 lxml 并在代码中更改为 。import xml.etree.ElementTree as ETfrom lxml import etree as ET