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

使用Python的lxml创建XML元素时遇「Invalid tag name」错误求助

解决lxml生成带命名空间XML的标签错误问题

错误原因

直接用前缀:标签名的格式创建元素是lxml不允许的,它要求使用Clark表示法({命名空间URI}本地标签名)来指定带命名空间的元素——前缀只是命名空间URI的别名,创建元素时必须基于实际的命名空间URI。

修正后的代码

import datetime
from lxml import etree

# 定义命名空间URI常量,方便复用
CRSDAC2_NS = 'urn:sti:ties:crsdac2:v1'
CRS_NS = 'urn:sti:ties:crstypessti:v1'
XSI_NS = 'http://www.w3.org/2001/XMLSchema-instance'

MESSAGETYPEINDIC = 'CRS701'
REPPERIOD = datetime.now().strftime("%Y-%m-%d")

# 使用Clark表示法创建根元素,同时指定命名空间映射和其他属性
root = etree.Element(
    f"{{{CRSDAC2_NS}}}CRS-DAC2-LT",
    attrib={
        'xmlns:crsdac2': CRSDAC2_NS,
        'xmlns:crs': CRS_NS,
        'xmlns:xsi': XSI_NS,
        'version': '3.141590118408203125',
        'xsi:schemaLocation': f'{CRSDAC2_NS} file:///G:/Tax/Tax%20Technology/CRS%20(DAC2)/XML%20Specifikacija%20(versija%20nuo%202020-12)/CRS-DAC2-LT_v0.4.xsd'
    }
)

# 创建子元素,同样用Clark表示法
message_spec = etree.SubElement(root, f"{{{CRSDAC2_NS}}}MessageSpec")
etree.SubElement(message_spec, f"{{{CRS_NS}}}MessageTypeIndic").text = MESSAGETYPEINDIC
etree.SubElement(message_spec, f"{{{CRS_NS}}}ReportingPeriod").text = REPPERIOD
etree.SubElement(root, f"{{{CRSDAC2_NS}}}MessageBody")

tree = etree.ElementTree(root)
# 生成格式化的XML字符串
tree_string = etree.tostring(
    tree,
    pretty_print=True,
    xml_declaration=True,
    encoding='UTF-8',
    standalone="yes"
)

print(tree_string.decode('UTF-8'))

关键修正点

  • 替换所有前缀:标签名为{命名空间URI}标签名的格式,lxml会自动根据xmlns属性映射生成对应的前缀。
  • 修正了crs命名空间的URI,与目标XML中的urn:sti:ties:crstypessti:v1保持一致(原代码中是错误的urn:sti:ties:sask:v1)。
  • 补充了缺失的import datetime语句。

运行这段代码后,生成的XML会完全符合你需要的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:15:27