如何在lxml中为属性添加命名空间

Mat*_*teo 13 python xml lxml scorm

我正在尝试使用python和lxml创建一个看起来像这样的xml条目:

<resource href="Unit 4.html" adlcp:scormtype="sco">
Run Code Online (Sandbox Code Playgroud)

我正在使用python和lxml.我遇到了adlcp:scormtype属性问题.我是xml的新手,所以如果我错了请纠正我. adlcp是一个名称空间,scormtype是一个在adlcp名称空间中定义的属性,对吧?
我甚至不确定这是否是正确的问题但是...我的问题是,如何使用lxml从非默认命名空间向元素添加属性?如果这是一个微不足道的问题,我会提前道歉.

use*_*019 16

这不是一个完整的回复,只是几个指针.

adlcp不是名称空间,它是名称空间前缀.命名空间在文档中通过类似属性定义xmlns:adlcp="http://xxx/yy/zzz"

在lxml中,您始终设置包含命名空间的元素/属性名称,例如, {http://xxx/yy/zzz}scormtype 而不仅仅是scormtype.然后,lxml将自动放入名称空间前缀.但是lxml会将前缀设置为ns0或类似,除非你做更多的小提琴,但这应该足够,因为前缀并不意味着什么.(但有些人更喜欢控制前缀名称;请参阅Element和SubElement函数的nsmap参数以及register_namespace函数).

我想看看在命名空间LXML教程,并深入Python - XML章节


小智 7

试试这个:

builder = ElementMaker(namespace="http://a.different.url/blah/v.10",
                       nsmap={
                         'adlcp': "http://a.namespace.url/blah/v.10",
                         'anotherns': "http://a.different.url/blah/v.10"
                       })

builder.resource()
builder.attrib['href'] = "Unit 4.html"
builder.attrib['{http://a.namespace.url/blah/v.10}scormtype'] = 'sco'

print(etree.tostring(builder, pretty_print=True))
Run Code Online (Sandbox Code Playgroud)