2013-10-29 52 views
-1

我想裝飾XML子樹LXML

<doc> 
    <a> 
    <op>xxx</op> 
    </a> 
</doc> 

<doc> 
    <a> 
    <cls> 
     <op>xxx</op> 
    </cls> 
    </a> 
</doc> 

我用這個Python代碼

from lxml import etree 
f = etree.fromstring('<doc><a><op>xxx</op></a></doc>') 

node_a = f.xpath('/doc/a')[0] 
ele = etree.Element('cls') 
node_a.insert(0, ele) 

node_cls = f.xpath('/doc/a/cls')[0] 
node_op = f.xpath('/doc/a/op')[0] 
node_cls.append(node_op) 
print etree.tostring(f, pretty_print=True) 

它是最佳的解決方案來改造這個XML樹?

現在我想獲得

<cls> 
    <doc> 
    <a> 
     <op>xxx</op>  
    </a> 
    </doc> 
</cls> 

我無法找到任何解決方案。

感謝您的幫助。

+0

什麼是你的問題? –

+0

在第一種情況下,我想添加 arround xxx。在第二種情況下,我想添加周圍 ...

回答

1

我更喜歡使用而不是。我發現它更容易處理。

這兩個問題都可以使用相同的方法解決,首先找到元素,獲取父元素,創建新元素並將舊元素放入其中。

from bs4 import BeautifulSoup 
import sys 

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'xml') 
for e in soup.find_all(sys.argv[2]): 
    p = e.parent 
    cls = soup.new_tag('cls') 
    e_extracted = e.extract() 
    cls.append(e_extracted) 
    p.append(cls) 

print(soup.prettify()) 

的腳本接受兩個參數,THR第一個是xml文件,第二個標籤與新標記包圍。運行它想:

python3 script.py xmlfile op 

國債收益率:

<?xml version="1.0" encoding="utf-8"?> 
<doc> 
<a> 
    <cls> 
    <op> 
    xxx 
    </op> 
    </cls> 
</a> 
</doc> 

對於<doc>,運行它想:

python3 script.py xmlfile doc 

有了結果如下:

<?xml version="1.0" encoding="utf-8"?> 
<cls> 
<doc> 
    <a> 
    <op> 
    xxx 
    </op> 
    </a> 
</doc> 
</cls>