我有以下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>
"""
答案 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}孩子们。