Как добавить пространство имен к атрибуту в lxml

Я пытаюсь создать запись xml, которая выглядит так, используя python и lxml:

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

Я использую питон и lxml. У меня проблемы с атрибутом adlcp:scormtype. Я новичок в xml, поэтому, пожалуйста, поправьте меня, если я ошибаюсь. adlcp — это пространство имен, а scormtype — атрибут, определенный в пространстве имен adlcp, верно?
Я даже не уверен, что это правильный вопрос, но... Мой вопрос в том, как добавить атрибут в элемент из пространства имен не по умолчанию с использованием lxml? Заранее извиняюсь, если это тривиальный вопрос.


person Mateo    schedule 03.09.2009    source источник


Ответы (2)


Это не полный ответ, а всего лишь несколько указателей.

adlcp — это не пространство имен, а префикс пространства имен. Пространство имен определяется в документе таким атрибутом, как xmlns:adlcp="http://xxx/yy/zzz"

В lxml вы всегда устанавливаете имя элемента/атрибута, включая пространство имен, например. {http://xxx/yy/zzz}scormtype вместо просто scormtype. Затем lxml автоматически вставит префикс пространства имен. Однако lxml установит префикс на ns0 или аналогичный, если вы не будете больше возиться, но этого должно быть достаточно, поскольку префикс ничего не значит. (Однако некоторые люди предпочитают управлять именем префикса; см. аргумент nsmap в функциях Element и SubElement и функцию register_namespace).

Я бы посмотрел учебник lxml по пространству имен, а также Погружение в Python — глава XML

person mmmmmm    schedule 03.09.2009
comment
Ссылка на python мертва (410 Gone) - person Jonas Schäfer; 23.08.2012
comment
Я перенаправил его на текущую версию - person mmmmmm; 12.01.2021

Попробуй это:

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))
person user4456183    schedule 15.01.2015
comment
операторы .attrib возвращают TypeError: объект functools.partial не поддерживает назначение элемента - person Tony Sepia; 25.02.2021