在Python中使用lxml,我需要在输入xml文件中用<mark> RNA </mark>替换“RNA”。代码如下

时间:2015-01-20 06:40:38

标签: python-2.7 lxml

  

我的输入 XML文件是:

<?xml version='1.0' encoding='UTF-8'?>
<try>
something somethingRNA and RNA in RNA.
</try> 
  

我的 Python 代码:

import lxml.etree as ET
import openpyxl
import re

url = 'output_15012015_test.xml'

tree = ET.parse(url)

lncrna = "RNA"
abstract = tree.xpath('//try)

string = abstract[0].text

if(abstract):
        anotherString = re.sub(r'\b'+lncrna.lower()+'\\b', '<mark>'+lncrna+'</mark>', string.lower())

abstract[0].text = anotherString
print abstract[0].text
tree.write('FalseRoller.xml', encoding='UTF-8', pretty_print=True)
  

输出

我获得了以下替换文字而不是 <mark>RNA</mark>

 &lt;mark&gt;RNA&lt;/mark&gt;
  

我认为它与tree.write()方法有关。我也是Python和社区的新手。请帮帮我。

1 个答案:

答案 0 :(得分:1)

您正在元素.text中设置XML标记,因此在写入XML时会将其解释为文本,而不是标记,并使用&...;转义字符。

您想要做的是:

  • .text划分为三个部分:在新标记之前,在新标记中, 在新标签
  • 之后
  • 添加新标签并设置文字和尾巴

参见代码:

tree = ET.parse(url)

lncrna = "RNA"
abstract = tree.xpath('//try')

aList = re.split(r'(\b'+lncrna+r'\b)', abstract[0].text, flags=re.IGNORECASE)

abstract[0].text = aList[0]
for i in range(1,len(aList),2):
  anElement = ET.SubElement(abstract[0], 'mark')
  anElement.text = aList[i]
  anElement.tail = aList[i+1]
  abstract[0].insert( (i-1)/2, anElement )

print abstract[0].text
tree.write('FalseRoller.xml', encoding='UTF-8', pretty_print=True)