Python 读取和更新XML中的字母数字值并生成新的output.XML文件时出现问题
我的XML是这样的Python 读取和更新XML中的字母数字值并生成新的output.XML文件时出现问题,python,xml,Python,Xml,我的XML是这样的 ABC000002SDF 1000000 可以 2020-03-23 -1727.55 0 2020-08-21 15:29:14 我试图解析此XML,读取并更新节点PolicyId(字母数字值)和TransactionDate(日期时间类型),并将其保存回新的输出XML,包括原始XML中具有相同值的其他节点 如果我分别为PolicyIDdef splitString(self):和TransactionDatedef updateLastModified(self)代码
ABC000002SDF
1000000
可以
2020-03-23
-1727.55
0
2020-08-21 15:29:14
我试图解析此XML,读取并更新节点PolicyId(字母数字值)和TransactionDate(日期时间类型),并将其保存回新的输出XML,包括原始XML中具有相同值的其他节点
如果我分别为PolicyIDdef splitString(self):
和TransactionDatedef updateLastModified(self)
代码按预期工作。但当我合并这两个代码并解析这个xml时,只有Transaction date节点按预期工作。不会反映PolicyId更改,也不会生成输出XML
对不起,没有提示我在哪里出错。打印def splitString(self)
时是否出错?您能否帮助修复policyid节点并生成新的输出xml。。。要生成新的输出文件,我正在使用self.tree.write('output.xml')
有一个错误NameError:name'self'未定义
。我将其定义为self.tree=ET.parse(r'C:\Users\\\ Desktop\XML\python.XML')
下面是我正在使用的全部代码:
import xml.etree.ElementTree as ET
from datetime import datetime
class TimestampUpdater(object):
def __init__(self, filepath):
self.meta_file = filepath
self.tree = ET.parse(r'C:\Users\\\Desktop\XML\python.xml')
def getMetadataTree(self):
return self.tree
def getMetadataRoot(self):
return self.tree.getroot()
def splitString(self):
for ROW in self.getMetadataRoot().findall('ROW'): ##
PolicyId = ROW.find('PolicyId')
#new_rank = int(PolicyId.text) + 1
#PolicyId.text = str(int(new_rank))
alpha = ""
num = ""
special = ""
for i in range(len(PolicyId)):
if (str[i].isdigit()):
num = num+ str[i]
elif((str[i] >= 'A' and str[i] <= 'Z') or
(str[i] >= 'a' and str[i] <= 'z')):
alpha += str[i]
else:
special +=str[i]
PolicyId.set('updated', 'yes')
self.getMetadataTree().write(self.meta_file)
#print(alpha)
#print(num)
#print(special)
print(alpha+num+special)
def updateLastModified(self):
today = datetime.now()
for ROW in self.getMetadataRoot().findall('ROW'): ##
TransactionDate = ROW.find('TransactionDate')
previous_update = datetime.strptime(TransactionDate.text, '%Y-%m-%d %H:%M:%S')
if previous_update < today:
TransactionDate.text = today.strftime('%Y-%m-%d %H:%M:%S')
self.getMetadataTree().write(self.meta_file)
def print_file_content(filename):
"""Print contents of a file"""
with open(filename, 'r') as fh:
for line in fh:
print(line.rstrip())
if __name__ == '__main__':
metafile = 'python.xml'
print("\n====Before updating:====")
print_file_content(metafile)
updater = TimestampUpdater(metafile)
updater.updateLastModified()
updater.splitString()
print("\n====After updating:====")
print_file_content(metafile)
self.tree.write('output.xml')
将xml.etree.ElementTree作为ET导入
从日期时间导入日期时间
类时间戳更新程序(对象):
定义初始化(self,filepath):
self.meta_文件=文件路径
self.tree=ET.parse(r'C:\Users\\\ Desktop\XML\python.XML')
def getMetadataTree(自身):
回归自我树
def getMetadataRoot(自身):
返回self.tree.getroot()
def拆分字符串(自):
对于self.getMetadataRoot().findall('ROW')中的行:##
PolicyId=ROW.find('PolicyId')
#new_rank=int(PolicyId.text)+1
#PolicyId.text=str(int(新排名))
alpha=“”
num=“”
special=“”
对于范围内的i(len(PolicyId)):
如果(str[i].isdigit()):
num=num+str[i]
elif((str[i]>='A'和str[i]='A'和str[i]='A'和str[i]='A'和str[i]考虑让第二个方法解析更新的XML,而不是覆盖在\uuu init\uuu
中解析的同一棵树
def splitString(self, doc):
self.tree = ET.parse(doc)
for ROW in self.getMetadataRoot().findall('ROW'):
PolicyId = ROW.find('PolicyId')
alpha = ""
num = ""
special = ""
for i in range(len(PolicyId)):
if (str[i].isdigit()):
num = num+ str[i]
elif((str[i] >= 'A' and str[i] <= 'Z') or
(str[i] >= 'a' and str[i] <= 'z')):
alpha += str[i]
else:
special +=str[i]
PolicyId.set('updated', 'yes')
self.getMetadataTree().write(self.meta_file)
def updateLastModified(self, doc):
today = datetime.now()
self.tree = ET.parse(doc)
for ROW in self.getMetadataRoot().findall('ROW'): ##
TransactionDate = ROW.find('TransactionDate')
previous_update = datetime.strptime(TransactionDate.text, '%Y-%m-%d %H:%M:%S')
if previous_update < today:
TransactionDate.text = today.strftime('%Y-%m-%d %H:%M:%S')
self.getMetadataTree().write(self.meta_file)
您不能在类外调用self
。请看最后一行。非常感谢冻糕,我尝试了第二个和第三个选项,但在更新output.xml中的policyId“def splitString(self,doc):”时仍然面临问题。我似乎仍在做一些错误的事情。您能帮助我完成完整的工作代码吗?~~def splitString(self,doc):self.my_tree=ET.parse(doc)for self.my_tree.getroot().findall('ROW'):PolicyId=ROW.find('PolicyId')---如果名称='main':元文件='python.xml'更新程序。updateLastModified('original.xml')更新程序。splitString('output.xml')打印文件内容(元文件)您面临的问题是什么?我忘了提到#2,您必须写出my_树
对象(不是原始的self.getMetadataTree()
)谢谢,我在执行这段代码时没有遇到任何异常,但代码并没有达到预期的效果,参考给定的示例XML,节点POLICYID预计将从“ABC000002SDF”更改为ABCSDF00002运行此代码后,节点将更改为getdatetime,这两个节点将更新并生成引用原始xml的输出xml。因此,原始xml与旧值保持不变,输出xml将在原始post中附加节点PolicyId和TransactionDate.full代码的更新值。请参阅改进后的解决方案对于更新的类方法。按原样,此代码仅更新
(不是其文本)值的update
属性,并更新
的文本。
def splitString(self, doc):
self.tree = ET.parse(doc)
for ROW in self.getMetadataRoot().findall('ROW'):
PolicyId = ROW.find('PolicyId')
alpha = ""
num = ""
special = ""
for i in range(len(PolicyId)):
if (str[i].isdigit()):
num = num+ str[i]
elif((str[i] >= 'A' and str[i] <= 'Z') or
(str[i] >= 'a' and str[i] <= 'z')):
alpha += str[i]
else:
special +=str[i]
PolicyId.set('updated', 'yes')
self.getMetadataTree().write(self.meta_file)
def updateLastModified(self, doc):
today = datetime.now()
self.tree = ET.parse(doc)
for ROW in self.getMetadataRoot().findall('ROW'): ##
TransactionDate = ROW.find('TransactionDate')
previous_update = datetime.strptime(TransactionDate.text, '%Y-%m-%d %H:%M:%S')
if previous_update < today:
TransactionDate.text = today.strftime('%Y-%m-%d %H:%M:%S')
self.getMetadataTree().write(self.meta_file)
updater = TimestampUpdater(metafile)
updater.updateLastModified('/path/to/original/file.xml')
updater.splitString(metafile)