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

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

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

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

2 ответа

Решение

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

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

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

Я хотел бы взглянуть на учебник lxml по пространству имен, а также на Dive into Python - глава XML

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

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))
Другие вопросы по тегам