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

