python解析XML文件并转存到excel「建议收藏」

python解析XML文件并转存到excel「建议收藏」python解析XML文件并转存到excel转换前的xml文档信息如下:处理后的效果如下:python代码如下:importxml.saxfromopenpyxlimportWorkbook,load_workbookimportosdefwrite_to_excel(two_dimension_list):path=os.path.dirname(os.path.realpath(__file__))#gettheparentpathofc

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

python解析XML文件并转存到excel

转换前的xml文档信息如下:
处理前的xml文件处理后的效果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
python代码如下:

import xml.sax
from openpyxl import Workbook, load_workbook
import os
def write_to_excel(two_dimension_list):
path = os.path.dirname(os.path.realpath(__file__))  # get the parent path of current file
try:
wb = load_workbook(path+"\\orderfile.xlsx") # load an existing workbook
ws = wb.create_sheet()
except:
wb = Workbook() # create a new workbook
ws = wb.create_sheet()
for c in range(len(two_dimension_list)):
for r in range(len(two_dimension_list[c])):
ws.cell(r+1,c+1).value = two_dimension_list[c][r]
wb.save(path+"\\orderfile.xlsx")
class OrderFileHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData=""
self.dic_orderdata = { 
}
self.dic_fileInfo = { 
}
self.op_code = []
self.list_optioncode = []
self.list_orderdata = []
self.list_fileInfo = []
# 文档启动时调用
def startDocument(self):
print("XML file parse start!")
# 遇到XML开始标签时调用,tag 是标签的名字,attributes 是标签的属性值字典
def startElement(self,tag,attributes):
self.CurrentData = tag
if tag == "orderData":
self.dic_orderdata['orderId'] = attributes.get('orderId')   # 用 get 方法,如果该键值对不存在会返回None
self.dic_orderdata['longVIN'] = attributes.get('longVIN')
self.dic_orderdata['shortVIN'] = attributes.get('shortVIN')
self.dic_orderdata['dummy'] = attributes.get('dummy')   # 不存在于 xml 文件中
self.dic_orderdata['softwareLevel'] = attributes.get('softwareLevel')
self.list_orderdata.append(list(self.dic_orderdata.values()))
print(self.dic_orderdata)
elif tag == 'fileInfo':
self.dic_fileInfo['date'] = attributes.get('date')
self.dic_fileInfo['comment'] = attributes.get('comment')
self.dic_fileInfo['author'] = attributes.get('author')
self.dic_fileInfo['plantId'] = attributes.get('plantId')
self.dic_fileInfo['firstCreationDate'] = attributes.get('firstCreationDate')
self.dic_fileInfo['latestCreationDate'] = attributes.get('latestCreationDate')
self.dic_fileInfo['vehicleState'] = attributes.get('vehicleState')
self.list_fileInfo.append(list(self.dic_fileInfo.values()))
# 元素结束调用
def endElement(self, tag):
if self.CurrentData == "optionCode":
self.op_code.append(self.optionCode)
self.CurrentData = ""
# 读取标签之间的字符时调用
def characters(self, content):
if self.CurrentData == "optionCode":
self.optionCode = content
# 解析器到达文档结尾时调用         
def endDocument(self):
self.list_orderdata.insert(0,list(self.dic_orderdata.keys()))
self.list_fileInfo.insert(0,list(self.dic_fileInfo.keys()))
self.list_optioncode.insert(0,['optionCode'])
self.list_optioncode.insert(1,self.op_code)
print("file parse success!")
if (__name__ == "__main__"):
# 创建一个 XMLReader
parser = xml.sax.make_parser()
# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# 重写 ContextHandler
Handler = OrderFileHandler()
parser.setContentHandler(Handler)
parser.parse("C:/Users/Administrator/Desktop/file/A0000000.xml")
print(Handler.list_optioncode)
write_to_excel(Handler.list_orderdata)
write_to_excel(Handler.list_fileInfo)
write_to_excel(Handler.list_optioncode)

如果xml文件较大,涉及到的属性比较多,人工敲代码也比较耗费时间。可以使用以下代码实现代码内容转换。

import os , sys , re
# 在代码文件相同目录下创建一个test.txt的文件,并将需要转换的xml片段粘贴到该文件中。并根据需要更改str_statement内容。
def generate_code():
file = os.path.dirname(os.path.realpath(__file__))+"\\test.txt"
with open(file,'a+') as f:
f.seek(0,0) # 将指针放到文件其实位置
line = str(f.readlines())
key = re.findall(r'\s(\w*)=',line)
print(key)
for item in range(len(key)):
attrs = key[item]
str_statement = "self.dic_fileInfo['"+attrs+"'] = attributes.get('"+attrs+"')"+'\n'
f.write(str_statement)
generate_code()

转换后的test.txt文件内容如下:

<fileInfo date="20170720065220" comment="RESERVED" author="system" plantId="gcdm" firstCreationDate="2017-07-20T06:52:20+08:00" latestCreationDate="2027-07-20T06:52:00+08:00" vehicleState="6300">
##上面是代码执行前加入的内容,下面是代码执行后追加的内容##
self.dic_fileInfo['date'] = attributes.get('date')
self.dic_fileInfo['comment'] = attributes.get('comment')
self.dic_fileInfo['author'] = attributes.get('author')
self.dic_fileInfo['plantId'] = attributes.get('plantId')
self.dic_fileInfo['firstCreationDate'] = attributes.get('firstCreationDate')
self.dic_fileInfo['latestCreationDate'] = attributes.get('latestCreationDate')
self.dic_fileInfo['vehicleState'] = attributes.get('vehicleState')
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171958.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 卸载vs2012的步骤_plsql卸载详细步骤

    卸载vs2012的步骤_plsql卸载详细步骤要卸载VS系列时才发现卸载VS还是很麻烦的事情,经过研究网上的卸载工具都没什么用,还是要自己手动卸载才彻底些。手动卸载步骤:VisualStudioExpressEditions进入控制面板,运行添加或删除程序 卸载”MSDNLibraryforVisualStudio2005Beta” 卸载”MicrosoftSQLServer2005Expr

  • origin如何在柱状图上面显示数据_origin柱状图横坐标自定义

    origin如何在柱状图上面显示数据_origin柱状图横坐标自定义经验:Origin做柱状图常遇问题/柱状图X坐标轴如何设置—小技巧对于每个搞科研的人来说,origin这个作图软件是必不可少的!但是,对于新手来说(我也算是半个新手*^__^*),它有时候显得有点高深,不知道该如何设置。就拿这次来说吧,同门要画一个性能随含量变化的柱状图(希望大体效果希望如上图,上图还没完全设置好),但是不知道该如何设置X坐标轴,因为含量的变化区间不是固定的,例如10%,20%,4…

  • 吞噬星空是鸿蒙三部曲吗,星辰变吞噬星空盘龙三部有什么关系

    吞噬星空是鸿蒙三部曲吗,星辰变吞噬星空盘龙三部有什么关系三部小说之间的关系就说这三部小说都属于鸿蒙三部曲,其中的各个宇宙之间都有一定的联系。《星辰变》是在红袖网上连载的奇幻修真小说,作者是我吃西红柿。小说以一个庞大的修真世界为背景,讲述了主角秦羽不甘于没落、努力修炼跨越先天不足的劣势,一步步踏上强者之路,最终成为鸿蒙掌控者的故事。《吞噬星空》,是一部东方科幻类型的网络小说,小说签约授权首发连载于红袖网。小说已经完本,作者是我吃西红柿。小说主要讲述了地球…

  • FFM原理理解与应用

    FFM原理理解与应用本文参考了美团团队的介绍文章。http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html以及http://blog.csdn.net/zc02051126/article/details/54614230FM和FFM模型是最近几年提出的模型,凭借其在数据量比较大并且特征稀疏的情况下,…

  • c语言oj平台作业,OJ平台C语言习题答案.pdf

    c语言oj平台作业,OJ平台C语言习题答案.pdfOJ平台C语言习题答案return0;}★★★★★★★★★★用指针编写一个程序,输入字符串后,统计其中各种字符的个数,输出其中大小编写一个函数,功能是使输入的字符串逆序输出。…

  • firefox os 2.0版模拟器QQ初体验

    firefox os 2.0版模拟器QQ初体验

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号