2011-12-08 61 views
4

我正在嘗試使用lxml.etree從JSON對象創建一個xml樹。在其中一些標記名CONTIN冒號的東西,如: -帶有「:」的lxml標籤名稱

「設置:當前的」我試着用

「{設置}當前」作爲標籤的名字,但我得到這個: -

NS0 :當前xmlns:ns0 =「設置」

+1

花一些時間來學習XML名稱空間的基礎知識。然後閱讀http://lxml.de/tutorial.html#namespaces。 – mzjn

回答

6

是的,首先閱讀並理解XML命名空間。然後用它來生成XML樹與命名空間:U

>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace'} 
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings'], nsmap=MY_NAMESPACES) 
>>> etree.tostring(e) 
'<settings:current xmlns:settings="http://example.com/url-for-settings-namespace"/>' 

而且你可以結合起來,與默認命名

>>> MY_NAMESPACES={'settings': 'http://example.com/url-for-settings-namespace', None: 'http://example.com/url-for-default-namespace'} 
>>> r=etree.Element('my-root', nsmap=MY_NAMESPACES) 
>>> d=etree.Element('{%s}some-element' % MY_NAMESPACES[None]) 
>>> e=etree.Element('{%s}current' % MY_NAMESPACES['settings']) 
>>> d.append(e) 
>>> r.append(d) 
>>> etree.tostring(r) 
'<my-root xmlns:settings="http://example.com/url-for-settings-namespace" xmlns="http://example.com/url-for-default-namespace"><some-element><settings:current/></some-element></my-root>' 

注意,你必須有一個元素在你的XML樹nsmap=MY_NAMESPACES層次結構。然後所有的下降節點都可以使用該聲明。你的情況,你有沒有這一點,所以LXML產生的命名空間的名稱,如ns0

此外,當您創建標籤名稱的新節點使用的命名空間URI,沒有命名空間名稱:{http://example.com/url-for-settings-namespace}current