2011-09-05 15 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を使用するものは、2つのバージョンを同じものとして扱う必要があります。 – 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文字列出力が生成されます。 –

関連する問題