重写xml并保存上下文

时间:2015-03-31 17:52:26

标签: python xml elementtree

我有以下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函数处理:< / p>

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文件中?

ie:我的例子中的新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 个答案:

答案 0 :(得分:1)

您可以将标记“text”设置为您需要的属性,然后只需调用etree.tostring(rootElt, prettyPrint = True)

是的,请注意:我正在选择所有<persName>标签,而不是所有标题:

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>

如果您想处理所有标题并且只处理名称 - 可能您想从标题标签本身(persName)中选择内部标记(head)?

for par in pars:
    # ...

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

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

此代码提供完全相同的结果,但在processLine函数中,您仍将处理整个<head>标记,而pers变量将包含所有标记{{1}孩子们。