如何创建带json:Array属性的XML元素?lxml报无效命名空间前缀错
解决lxml创建带json:Array属性XML元素的错误
错误原因
你把属性当成了命名空间映射来处理。nsmap参数的作用是定义命名空间前缀与URI的对应关系,而非直接设置元素属性。json:Array是带命名空间前缀的属性,需要先正确声明命名空间,再设置属性。
正确实现方式
首先明确json前缀对应的标准命名空间(通常为http://james.newtonking.com/projects/json,这是XML与JSON互转场景中常用的命名空间),再通过元素的属性参数设置json:Array="true"。
代码示例
from lxml.etree import Element, tostring # 定义json命名空间的URI JSON_NS = "http://james.newtonking.com/projects/json" # 创建元素:先通过nsmap声明json前缀,再设置带命名空间的属性 foo = Element("foo", nsmap={"json": JSON_NS}) # 用{命名空间URI}属性名的方式设置带前缀的属性 foo.set(f"{{{JSON_NS}}}Array", "true") # 输出XML print(tostring(foo, encoding="unicode"))
输出结果
<foo xmlns:json="http://james.newtonking.com/projects/json" json:Array="true"/>
补充说明
如果当前上下文已提前声明过json命名空间(比如父元素已包含命名空间声明),也可以直接用前缀设置属性,但这种方式容易引发命名空间未声明的错误,更推荐上面显式声明命名空间的写法:
from lxml.etree import Element, tostring foo = Element("foo") # 前提:当前上下文已存在json命名空间的声明 foo.set("json:Array", "true")
内容的提问来源于stack exchange,提问作者Mujeeb Ur Rehman
相关产品推荐
相关产品推荐

