2015-03-31 59 views
0

我有類似下面的XML字符串:重寫XML和保存方面

xml = """ 
<body> 
    <head>1. Un livre sur <persName type="author" key="Ronsard, Pierre de (1524-1585)" ref="http://www.idref.fr/027107957">Ronsard</persName></head> 
    <head>2. <title>La pitié des églises</title> par <persName key="Barrès, Maurice (1862-1923)" ref="http://www.idref.fr/026706601" type="author">Barrès</persName></head> 
</body> 
""" 

我有一些函數調用processLine(line)這需要一整行(內<head>文本沒有標籤),在我的情況下,這兩條線將由processLine函數進行處理:

1. Un livre sur Ronsard 
2. La pitié des églises par Barrès 

並連接某些字符串到每一行的某些詞,例如:

"Ronsard" becomes "Ronsard I-PER" 
"Barrès" becomes "Barrès I-PER" 

下面是使用Python的etree庫到目前爲止,我已經取得了代碼:

from lxml import etree 

root = etree.fromstring(xml) 
pars = root.xpath('//body//head') 

for par in pars: 
    line = par.text # return the line stripped from tags 
    processLine(line) 

我的問題:我如何保存在XML文件中的變化,而不失去其結構?

即:在我爲例我的新的XML文件將變爲:

newxml = """ 
<body> 
    <head>1. Un livre sur <persName type="author" key="Ronsard, Pierre de (1524-1585)" ref="http://www.idref.fr/027107957">Ronsard I-PER</persName></head> 
    <head>2. <title>La pitié des églises</title> par <persName key="Barrès, Maurice (1862-1923)" ref="http://www.idref.fr/026706601" type="author">Barrès I-PER</persName></head> 
</body> 
""" 

回答

1

您可以在標籤」 text屬性設置爲你需要什麼,然後就打電話etree.tostring(rootElt, prettyPrint = True)

是啊,注意:我選擇所有<persName>標籤,不是所有的標題itselves:

pars = root.xpath('//body//head//persName') 

檢查了這一點:

from lxml import etree 

xml = """ 
<body> 
    <head>1. Un livre sur <persName type="author" key="Ronsard, Pierre de (1524-1585)" ref="http://www.idref.fr/027107957">Ronsard</persName></head> 
    <head>2. <title>La pitié des églises</title> par <persName key="Barrès, Maurice (1862-1923)" ref="http://www.idref.fr/026706601" type="author">Barrès</persName></head> 
</body> 
""" 

root = etree.fromstring(xml) 
pars = root.xpath('//body//head//persName') 

for par in pars: 
    line = par.text # return the line stripped from tags 
    processLine(line) 

    par.text = par.text + ' I-PER' 

print(etree.tostring(root, unicode = True, pretty_print = True)) 

這將打印以下XML:

<body> 
    <head>1. Un livre sur <persName type="author" key="Ronsard, Pierre de (1524-1585)" ref="http://www.idref.fr/027107957">Ronsard I-PER</persName></head> 
    <head>2. <title>La pitié des églises</title> par <persName key="Barrès, Maurice (1862-1923)" ref="http://www.idref.fr/026706601" type="author">Barrès I-PER</persName></head> 
</body> 

如果你想處理所有的標題,然後只處理名稱 - 可能你想要t o從標題標籤本身(head)中選擇內部標籤(persName)?

for par in pars: 
    # ... 

    pers = par.xpath('//persName') 

    for per in pers: 
     per.text = per.text + ' I-PER' 

該代碼給出完全相同的結果,但processLine函數內你仍然會處理整個<head>標籤,而pers變量將包含所有標籤的<persName>孩子。