2015-03-31 17 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>孩子。