2011-09-05 67 views
6

我試圖創建一個內存中的xml文檔,以便根的子節點都需要名稱空間。使用python/ElementTree和名稱空間創建xml文檔

最後的文件應該是這個樣子:

<Feed>    
<FeedEntity Id="0000" 
     xmlns="http://schemas.example.com/search/query/2010/5/revision"> 

    <FeedRequest locale="en-US" title="<some value>"/> 
</FeedEntity> 
... another FeedEntity element ... 
</Feed>    

然而,當我打印出來,我跟ElementTree的lib中創建的文檔,它看起來更像是這樣的:

<Feed> 
    <ns0:FeedEntity Id="0000" 
     xmlns:ns0="http://schemas.example.com/search/query/2010/5/revision"> 

     <FeedRequest locale="en-US" title="<some value>"/> 
    </ns0:FeedEntity> 
</Feed> 

這裏的我是如何創建的文檔:

counter = 0 
namespace = "http://schemas.example.com/search/query/2010/5/revision" 

root = Element("Feed")   

node_name = "{%s}FeedEntity" % (namespace,);     
feed_entity_element = Element(node_name)   

feed_entity_element["Id"] = "%04d" % (counter,); 

feed_request_element = Element("FeedRequest"); 
feed_request_element["Culture"] = self.culture; 
feed_request_element["Query"] = address;   

# append each of the elements to the xml document 
feed_entity_element.append(feed_request_element); 

root.append(feed_entity_element); 

str_data = ET.tostring(root) 
print str_data 

如何擺脫最終XML中的「ns0」部分,使其看起來更像上面提到的第一個示例?

+3

你爲什麼要改變它 - 任何使用XML的應該將兩個版本視爲相同。 – Mark

回答

4

隨着xml.etree,你不能得到確切的輸出作爲第一個例子,但可以使用(全球)register_namespace()功能使用一個「好」字頭比「NS0」。例如:ET.register_namespace('rev', 'http://schemas.example.com/search/query/2010/5/revision')將確保輸出看起來像rev:FeedEntity

但是,(兼容)lxml庫在命名空間前綴方面更爲靈活,而allows you to provide a prefix mapping when creating an element也更靈活。

+1

原來,你也可以爲元素分配屬性'xmlns',它將產生相同的xml字符串輸出。 –