You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用lxml.etree.xmlfile()序列化时设置命名空间前缀?

问题:XML顺序写入时命名空间前缀未按预期显示为xsl:

我尝试顺序写入一个大型XML文件,极简代码示例如下:

import lxml.etree as ET

ET.register_namespace('xsl', 'http://www.w3.org/1999/XSL/Transform')
with ET.xmlfile('../output/test.xml', encoding='utf-8') as xf:
     xf.write_declaration()
     with xf.element(ET.QName('http://www.w3.org/1999/XSL/Transform', 'root')):
         with xf.element('sub'):
             pass

得到的输出如下:

<?xml version='1.0' encoding='utf-8'?>
<ns0:root xmlns:ns0="http://www.w3.org/1999/XSL/Transform">
     <sub>
     </sub>
</ns0:root>

我期望前缀为xsl:...,但实际得到的是通用的ns0:...,请问需要调整哪里才能实现?


解决方法

问题出在xf.element()的调用方式上:当使用ET.QName传入命名空间URI和本地名称时,xmlfile的元素写入逻辑没有关联到你已注册的xsl前缀。

修改方式很简单:直接在xf.element()中使用带前缀的元素名字符串'xsl:root',同时保留之前的命名空间注册代码即可。

修改后的代码:

import lxml.etree as ET

ET.register_namespace('xsl', 'http://www.w3.org/1999/XSL/Transform')
with ET.xmlfile('../output/test.xml', encoding='utf-8') as xf:
     xf.write_declaration()
     with xf.element('xsl:root'):
         with xf.element('sub'):
             pass

此时生成的XML输出会符合预期:

<?xml version='1.0' encoding='utf-8'?>
<xsl:root xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
     <sub>
     </sub>
</xsl:root>

内容的提问来源于stack exchange,提问作者Luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 15:34:54