2009-09-03 5 views
9

Я пытаюсь создать элемент XML, который выглядит, как это с помощью питона и LXML:Как добавить пространство имен атрибута в LXML

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

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

ответ

15

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

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

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

Я хотел бы посмотреть на lxml tutorial on namespace, а также Dive into Python - XML chapter

+0

Погружение питона ссылка мертва (410) Унесенные –

+0

@JonasWielicki - обновлён с новой ссылке – Mark

4

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

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)) 
Смежные вопросы