19

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

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

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

4

2 回答 2

17

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

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 章节

于 2009-09-03T17:13:08.863 回答
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))
于 2015-01-15T05:07:50.370 回答