2013-06-13 94 views
1

我試圖創建一個XML文件,以便它具有以下骨架,最好使用在Python 2.7 xml.etree模塊:Python 2.7和xml.etree:如何使用多個命名空間創建XML文件?

<?xml version="1.0"?> 
<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" thing1="this" thing2="that"> 
    .... 
    <somedata bar="1"> 
    <moredata whatsit="42"></moredata> 
    </somedata> 
    .... 
</foo> 

這是「富......」行那使我煩惱。我嘗試使用nsmap來引入xsi和xsd,但導致「無法序列化」錯誤。

我可以構建或以其他方式破解這一行的文本是完全按照我想要的,但我想學習要做到這一點編程方式使用xml.etree(外部庫拉是不是在這種情況下,最好)。

我認爲這是一種常見的模式,但我只是沒有找到它的任何地方爲Python和etree。

+0

我試圖做一次類似的事情,不幸的是,似乎'xml.etree'太弱了。 –

+0

是否有可能所有「xmlns:xsi」和「xmlns:xsd」業務都是多餘的,因爲「thing1」和「thing2」沒有附加任何名稱空間?我只是擔心我只是簡單地介紹一個案例,錯過了學習正確做法的機會(其他案例可能有更嚴格的要求)。 – MartyMacGyver

回答

3

如果前綴在文檔中使用;你可以調用register_namespace()添加它們:

import sys 
import xml.etree.ElementTree as etree 

xsi = "http://www.w3.org/2001/XMLSchema-instance" 
xsd = "http://www.w3.org/2001/XMLSchema" 
ns = {"xmlns:xsi": xsi, "xmlns:xsd": xsd} 
for attr, uri in ns.items(): 
    etree.register_namespace(attr.split(":")[1], uri) 

foo = etree.Element("foo", 
    dict(thing1="this", thing2="that")) # put `**ns))` if xsi, xsd are unused 
somedata = etree.SubElement(foo, "somedata", dict(bar="1")) 
etree.SubElement(somedata, "moredata", 
    {"whatsit": "42", etree.QName(xsi, "type"): etree.QName(xsd, "string")}) 

etree.ElementTree(foo).write(sys.stdout, xml_declaration=True) 

否則,你可以明確地設置屬性(ns字典)如果你需要它。

+0

這似乎工作(我不太清楚我需要在moredata輸出中的「xsi:type =」xsd:string「」位,但至少這顯示瞭如何正確設置名稱空間)。謝謝!如果你認爲我的問題和你的答案能夠幫助其他人(我認爲會這樣),請上實物。 – MartyMacGyver

相關問題