以下Python代码
import xml.etree.cElementTree as ET
import time
import fileinput
import re
ts = str(int(time.time()))
modifiedline =''
for line in fileinput.input("singleoutbound.xml"):
line = re.sub('OrderName=".*"','OrderName="'+ts+'"', line)
line = re.sub('OrderNo=".*"','OrderNo="'+ts+'"', line)
line = re.sub('ShipmentNo=".*"','ShipmentNo="'+ts+'"', line)
line = re.sub('TrackingNo=".*"','TrackingNo="'+ts+'"', line)
line = re.sub('WaveKey=".*"','WaveKey="'+ts+'"', line)
modifiedline=modifiedline+line
返回修改后的行字符串,其中在找到第一个匹配项的地方截断一些行
如何确保它返回每行的完整字符串?
编辑:
受托马拉克回答的启发,我改变了解决这个问题的方式
import xml.etree.cElementTree as ET
import time
ts = str(int(time.time()))
doc = ET.parse('singleoutbound.xml')
for elem in doc.iterfind('//*'):
if 'OrderName' in elem.attrib:
elem.attrib['OrderName'] = ts
if 'OrderNo' in elem.attrib:
elem.attrib['OrderNo'] = ts
if 'ShipmentNo' in elem.attrib:
elem.attrib['ShipmentNo'] = ts
if 'TrackingNo' in elem.attrib:
elem.attrib['TrackingNo'] = ts
if 'WaveKey' in elem.attrib:
elem.attrib['WaveKey'] = ts
doc.write('singleoutbound_2.xml')
最佳答案
以下是如何使用 ElementTree 修改 XML 文件而不意外破坏它:
import xml.etree.cElementTree as ET
import time
ts = str(int(time.time()))
doc = ET.parse('singleoutbound.xml')
for elem in doc.iterfind('//*[@OrderName]'):
elem.attrib['OrderName'] = ts
# and so on
doc.write('singleoutbound_2.xml')
需要理解的事情:
- XML 表示由元素、属性和值等组成的树形数据结构。将其视为基于行的纯文本无法认识到这一事实。
- 有一种语言可以从数据树中选择项目,称为 XPath。它很强大而且不难学。学习它。我在上面使用了
//*[@OrderName]
来查找具有OrderName
属性的所有元素。 - 尝试使用字符串替换和正则表达式等不正确的工具修改文档树将导致代码更加复杂且难以维护。您将遇到完全有效的输入(您的正则表达式没有特殊情况)的运行时错误、字符编码问题和仅当有人查看您的程序输出时才会捕获的静默错误。换句话说:这是错误的做法,所以不要这样做。
- 上面的代码实际上比您的代码更简单,更容易推理和扩展。
关于python - 在Python中用正则表达式替换多个字符串,以获取截断字符串的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39126870/