如何使用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
相关产品推荐
相关产品推荐

