2009-09-03 11 views
9

Próbuję utworzyć wpis xml, który wygląda tak, używając Python i lxml:Jak dodać obszaru nazw do atrybutu w lxml

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

używam Python i lxml. Mam problem z atrybutem adlcp:scormtype. Jestem nowy w xml, więc proszę, popraw mnie, jeśli się mylę. adlcp to przestrzeń nazw, a scormtype to atrybut zdefiniowany w przestrzeni nazw adlcp, prawda?
Nie jestem nawet pewien, czy to jest właściwe pytanie, ale ... Moje pytanie brzmi: jak dodać atrybut do elementu z innej niż domyślna przestrzeni nazw za pomocą lxml? Z góry przepraszam, jeśli to jest banalne pytanie.

Odpowiedz

15

To nie jest pełna odpowiedź, ale tylko kilka wskazówek.

adlcp nie jest przestrzenią nazw, jest prefiksem przestrzeni nazw. Przestrzeń nazw zdefiniowana jest w dokumencie przez atrybut taki jak xmlns:adlcp="http://xxx/yy/zzz"

W lxml zawsze ustawiasz nazwę elementu/atrybutu obejmującą obszar nazw np. {http://xxx/yy/zzz}scormtype zamiast tylko scormtype. lxml automatycznie wstawi prefiks przestrzeni nazw. Jednak lxml ustawi przedrostek na ns0 lub podobny, chyba że zrobisz więcej szarpnięć, ale to powinno wystarczyć, ponieważ prefiks nie ma znaczenia. (Jednak niektórzy wolą kontrolować nazwę prefiksu, zobacz argument nsmap w funkcjach Element i SubElement oraz funkcja register_namespace).

chciałbym spojrzeć na lxml tutorial on namespace a także Dive into Python - XML chapter

+0

Zanurz się linkiem Pythona jest martwy (410 Brak) –

+0

@JonasWielicki - aktualizowana o nowe połączenia – Mark

4

Spróbuj tego:

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)) 
Powiązane problemy