2009-09-03 12 views
9

Je suis en train de créer une entrée xml qui ressemble à ceci en utilisant python et lxml:Comment ajouter un espace de noms à un attribut dans lxml

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

J'utilise python et lxml. J'ai des problèmes avec l'attribut adlcp:scormtype. Je suis nouveau au xml alors s'il vous plaît corrigez-moi si je me trompe. adlcp est un espace de noms et scormtype est un attribut qui est défini dans l'espace de noms adlcp, n'est-ce pas?
Je ne suis même pas sûr si c'est la bonne question mais ... Ma question est, comment est-ce que j'ajoute un attribut à un élément d'un espace de noms non par défaut en utilisant lxml? Je m'excuse d'avance si c'est une question triviale.

Répondre

15

Ceci n'est pas une réponse complète mais seulement quelques pointeurs.

adlcp n'est pas l'espace de nom c'est un préfixe d'espace de noms. L'espace de noms est défini dans le document par un attribut tel que xmlns:adlcp="http://xxx/yy/zzz"

En lxml, vous définissez toujours un nom d'élément/d'attribut incluant l'espace de noms, par ex. {http://xxx/yy/zzz}scormtype au lieu de simplement scormtype. lxml placera alors un préfixe d'espace de nommage automatiquement. Cependant, lxml mettra le préfixe à ns0 ou similaire à moins que vous ne fassiez plus de bidouillage, mais cela devrait suffire car le préfixe ne veut rien dire. (Cependant, certaines personnes préfèrent contrôler le nom du préfixe, voir l'argument nsmap sur les fonctions Element et SubElement, et la fonction register_namespace).

Je regardais la lxml tutorial on namespace et aussi Dive into Python - XML chapter

+0

Plongez dans le lien python est mort (410 Déplacé) –

+0

@JonasWielicki - mis à jour avec le nouveau lien – Mark

4

Essayez ceci:

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)) 
Questions connexes