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

时间:2009-09-03 16:17:52

标签: python xml lxml scorm

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

<resource href="Unit 4.html" adlcp:scormtype="sco">

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

2 个答案:

答案 0 :(得分:16)

这不是一个完整的回复,只是一些指示。

adlcp不是命名空间,而是命名空间前缀。命名空间在文档中由xmlns:adlcp="http://xxx/yy/zzz"

等属性定义

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

我会查看lxml tutorial on namespaceDive into Python - XML chapter

答案 1 :(得分:6)

试试这个:

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))