如何在lxml中为属性添加命名空间
我正在尝试用Python和lxml创建一个看起来像这样的XML条目:
<resource href="Unit 4.html" adlcp:scormtype="sco">
我在使用Python和lxml的时候,遇到了关于adlcp:scormtype
这个属性的问题。我对XML还不太熟悉,如果我说错了,请纠正我。adlcp
是一个命名空间,而scormtype
是定义在adlcp命名空间中的一个属性,对吧?
我甚至不确定这是不是个正确的问题,但我想问的是,如何用lxml给一个来自非默认命名空间的元素添加属性?如果这个问题很简单,我提前道歉。
2 个回答
9
试试这个:
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))
18
这不是一个完整的回复,只是一些小提示。
adlcp 不是命名空间,而是命名空间的前缀。命名空间是在文档中通过一个属性来定义的,比如 xmlns:adlcp="http://xxx/yy/zzz"
。
在 lxml 中,你总是需要在设置元素或属性名称时包括命名空间,比如说 {http://xxx/yy/zzz}scormtype
,而不是单纯的 scormtype。这样 lxml 会自动添加命名空间前缀。不过,lxml 会把前缀设置为 ns0 或类似的名字,除非你做一些额外的调整,但这样也足够了,因为前缀本身并没有特别的意义。(不过有些人喜欢自己控制前缀的名称;可以查看 Element 和 SubElement 函数中的 nsmap 参数,以及 register_namespace 函数)。
我建议你看看 lxml 的命名空间教程,还有 Dive into Python - XML 章节。