2011-06-15 20 views
1

我在使用lxml的find()方法在xml文件中選擇節點時遇到問題。本質上,我試圖將一個節點從一個XML文件移動到另一個。python lxml添加未使用的名稱空間

文件1:

<somexml xmlns:a='...' xmlns:b='...' xmlns:c='...'> 
    <somenode id='foo'> 
     <something>bar</something> 
    </somenode> 
</somexml> 

一旦我解析文件1,做一個在它身上找到:

node = tree.find('//*[@id="foo"]') 

節點看起來是這樣的:

<somenode xmlns:a='...' xmlns:b='...' xmlns:c='...'> 
    <something>bar</something> 
</somenode> 

注意到它增加了命名空間在該文檔中找到的那個節點。但是,該節點中沒有使用任何這些名稱空間。我將如何處理:A)不編寫未在選定節點中使用的名稱空間,或者B)刪除未使用的名稱空間聲明?如果它在選定節點中使用,那麼我將需要它,但除此之外,我想擺脫它們。有任何想法嗎?謝謝!

+2

[從lxml.objectify.ObjectifiedElement剝離python命名空間屬性]的可能重複(http://stackoverflow.com/questions/6141464/stripping-python-namespace-attributes-from-an-lxml-objectify-objectifiedelement) – Daenyth 2011-06-15 23:19:54

回答

3

如果名稱空間在文檔中,則文檔使用名稱空間。名稱空間正在這些節點中使用,因爲這些節點是聲明名稱空間的子樹的一部分。按照Daenyth給出的鏈接將其刪除,或者在將它們變成lxml對象之前將它們從XML字符串中除去。

+1

明白了。是的,我一直在努力的是,一旦我對原始XML運行find(),結果仍然在原始文檔的上下文中。我使用copy.deepcopy刪除上下文,然後使用rand etree.cleanup_namespaces刪除所有未使用的名稱空間。這有效地做我需要的。謝謝您的幫助! – Greg 2011-06-16 22:06:55