Python 读取和更新XML中的字母数字值并生成新的output.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)代码

我的XML是这样的


ABC000002SDF
1000000
可以
2020-03-23
-1727.55
0
2020-08-21 15:29:14
我试图解析此XML,读取并更新节点PolicyId(字母数字值)和TransactionDate(日期时间类型),并将其保存回新的输出XML,包括原始XML中具有相同值的其他节点

如果我分别为PolicyID
def splitString(self):
和TransactionDate
def 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)