Как добавить пространство имен к атрибуту в 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))