2013-09-25 62 views
1

短版: 如何添加的xmlns:與LXML X1 =「http://www.w3.org/2001/XInclude」前綴decleration到我的根元素在Python ?在python添加XML前綴聲明與LXML

語境

我有一些XML文件,其中包括ID的其他文件。

這些ID代表引用的文件名。

使用lxml我設法用適當的XInclude語句替換這些,但如果我沒有前綴刪除,我的XML解析器將不會添加包含,這是正常的。

編輯: 我不會包含我的代碼,因爲它不會幫助理解問題。我可以很好地處理文檔,我的問題是序列化。

所以從這個 <root> <somechild/> </root>

我想在我的輸出文件中得到這個<root xmlns:xi="http://www.w3.org/2001/XInclude"> <somechild/> </root>

爲此,我嘗試使用

`

tree = ET.parse(fileName) 
root = tree.getroot() 
root.nsmap['xi'] = "http://www.w3.org/2001/XInclude" 
tree.write('output.xml', xml_declaration=True, encoding="UTF-8", pretty_print=True) 

`

+1

你能分享一些代碼,就看你如何使用LXML? lxml文檔有幾個關於如何使用名稱空間的例子:[here](http://lxml.de/tutorial.html#namespaces),[here](http://lxml.de/parsing.html#parser-options )和[這裏](http://lxml.de/xpathxslt.html#namespaces-and-prefixes) –

回答

1

屬性nsmap不可寫給我的錯誤,當我嘗試你的代碼。

您可以嘗試註冊您的名稱空間,刪除根元素的當前屬性(保存後),使用set()方法添加名稱空間並恢復屬性。

一個例子:

>>> root = etree.XML('<root a1="one" a2="two"> <somechild/> </root>') 
>>> etree.register_namespace('xi', 'http://www.w3.org/2001/XInclude') 
>>> etree.tostring(root) 
b'<root a1="one" a2="two"> <somechild/> </root>' 
>>> orig_attrib = dict(root.attrib) 
>>> root.set('{http://www.w3.org/2001/XInclude}xi', '') 
>>> for a in root.attrib: del root.attrib[a] 
>>> for a in orig_attrib: root.attrib[a] = orig_attrib[a] 
>>> etree.tostring(root) 
b'<root xmlns:xi="http://www.w3.org/2001/XInclude" a1="one" a2="two"> <somechild/> </root>' 
>>> root.nsmap 
{'xi': 'http://www.w3.org/2001/XInclude'} 
+0

感謝您的反饋。我現在無法測試,但我很快就會回覆你。與此同時,我做了一次XSLT轉換,將命名空間添加到任何XML根目錄。我把這個變種稱爲我的根,然後就可以了,但是你的解決方案似乎更簡單。 –

+0

是的,這工作,顯然沒有「乾淨」的解決方案 –