2009-09-03 63 views
9

我试图创建一个XML条目,看起来像这样使用python和lxml的:如何将命名空间添加到一个属性LXML

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

我使用Python和lxml的。我在adlcp:scormtype属性中遇到问题。我是新来的XML,所以如果我错了,请纠正我。 adlcp是一个命名空间,scormtype是在adlcp命名空间中定义的属性,对吗?
我甚至不确定这是否是正确的问题,但......我的问题是,如何使用lxml将属性添加到非默认名称空间的元素中?如果这是一个微不足道的问题,我很抱歉。

回答

15

这不是一个完整的答复,但只是几个指针。

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 namespace,也Dive into Python - XML chapter

+0

深入Python链接是死的(410飘) – 2012-08-23 10:18:36

+0

@JonasWielicki - 与新的链接更新 – Mark 2012-08-23 12:32:35

4

试试这个:

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)) 
相关问题