【Python】python对xml解析的两种方式实现

文章介绍了两种方法使用Python的xml.dom.minidom模块解析XML文件,提取特定元素的数据,然后利用pandas将数据存储到DataFrame并导出为Excel表格。第一种方法是手动编写,第二种是通过动态生成变量名简化代码,便于维护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需要处理的xml文件内容:该部分根据个人进行修改

需处理的XML文件格式

方式1:参考别人的写法,具体的按照结果进行实现

#!/usr/bin/python3

import xml.dom.minidom  as xd #导入处理xml文件的模块
import pandas as pd
import xlwt


try:
    BRANCH_CODE_LIST = []
    DEPT_ID_LIST = []
    DEPT_CODE_LIST = []
    DEPT_NAME_LIST = []
    LEVELS_LIST = []
    IS_USED_LIST = []
    INPUTCODE1_LIST = []
    INPUTCODE2_LIST = []
    KIND_ID_LIST = []
    STATE_LIST = []
    PARENT_ID_LIST = []

    #使用minidom解析器打卡xml文档
    dom = xd.parse("E:\workstation\pythonStation\dept.xml")
    #得到文档元素对象
    Packet = dom.documentElement #用于得到dom对象的文档元素,并把获得的对象给root
    print((Packet))

    if Packet.hasAttribute("defdef"):
        print('Root element: %s' % (Packet.getAttribute("defdef")))
    #获得标签为Body的多组标签
    child_tag = Packet.getElementsByTagName("GetDeptDict")


    for i in range(len(child_tag)):   
        tag_child = child_tag[i]
        #索引号
        BRANCH_CODE_VALUE = tag_child.getElementsByTagName('BRANCH_CODE')[0].firstChild.data #获得元素属性对应的值
        # print(BRANCH_CODE_VALUE)
        BRANCH_CODE_LIST.append(BRANCH_CODE_VALUE)
        #科室内部编号
        DEPT_ID_VALUE = tag_child.getElementsByTagName('DEPT_ID')[0].firstChild.data #获得元素属性对应的值
        # print(DEPT_ID_VALUE)
        DEPT_ID_LIST.append(DEPT_ID_VALUE)
        #科室编号
        DEPT_CODE_VALUE = tag_child.getElementsByTagName('DEPT_CODE')[0].firstChild.data #获得元素属性对应的值
        # print(DEPT_CODE_VALUE)
        DEPT_CODE_LIST.append(DEPT_CODE_VALUE)
        #科室名称
        DEPT_NAME_VALUE = tag_child.getElementsByTagName('DEPT_NAME')[0].firstChild.data #获得元素属性对应的值
        # print(DEPT_NAME_VALUE)
        DEPT_NAME_LIST.append(DEPT_NAME_VALUE)
        #等级编号
        # LEVELS_VALUE = 
        if not tag_child.getElementsByTagName('LEVELS')[0].firstChild:
            LEVELS_VALUE= ""
        else:
            LEVELS_VALUE = tag_child.getElementsByTagName('LEVELS')[0].firstChild.data
        # print(LEVELS_VALUE)
        LEVELS_LIST.append(LEVELS_VALUE)
        #使用状态
        IS_USED_VALUE = tag_child.getElementsByTagName('IS_USED')[0].firstChild.data #获得元素属性对应的值
        # print(IS_USED_VALUE)
        IS_USED_LIST.append(IS_USED_VALUE)
        #输入码1
        INPUTCODE1_VALUE = tag_child.getElementsByTagName('INPUTCODE1')[0].firstChild.data #获得元素属性对应的值
        # print(INPUTCODE1_VALUE)
        INPUTCODE1_LIST.append(INPUTCODE1_VALUE)
        #输入码2
        INPUTCODE2_VALUE = tag_child.getElementsByTagName('INPUTCODE2')[0].firstChild.data #获得元素属性对应的值
        # print(INPUTCODE2_VALUE)
        INPUTCODE2_LIST.append(INPUTCODE2_VALUE)
        #类型编号
        KIND_ID_VALUE = tag_child.getElementsByTagName('KIND_ID')[0].firstChild.data #获得元素属性对应的值
        # print(KIND_ID_VALUE)
        KIND_ID_LIST.append(KIND_ID_VALUE)
        #状态编号
        STATE_VALUE = tag_child.getElementsByTagName('STATE')[0].firstChild.data #获得元素属性对应的值
        # print(STATE_VALUE)
        STATE_LIST.append(STATE_VALUE)
        #父层节点
        if not tag_child.getElementsByTagName('PARENT_ID')[0].firstChild:
            PARENT_ID_VALUE= "2323"
        else:
            PARENT_ID_VALUE = tag_child.getElementsByTagName('PARENT_ID')[0].firstChild.data
        # print(PARENT_ID_VALUE)
        PARENT_ID_LIST.append(PARENT_ID_VALUE)
    
    
    
    #将列表存储为字典
    all_dict = {
        "BRANCH_CODE":BRANCH_CODE_LIST,
        "DEPT_ID":DEPT_ID_LIST,
        "DEPT_CODE":DEPT_CODE_LIST,
        "DEPT_NAME":DEPT_NAME_LIST,
        "LEVELS":LEVELS_LIST,
        "IS_USED":IS_USED_LIST,
        "INPUTCODE1":INPUTCODE1_LIST,
        "INPUTCODE2":INPUTCODE2_LIST,
        "KIND_ID":KIND_ID_LIST,
        "STATE":STATE_LIST,
        "PARENT_ID":PARENT_ID_LIST
    } 

    df = pd.DataFrame(all_dict) #将字典转换为DataFrame
    
    #将DataFrame数据写入excel表中
    with pd.ExcelWriter('car_table.xls') as Writer:
        df.to_excel(Writer,'Sheet1',index=False)
except Exception as e:
    print(e) 


方式2:按照自动判断生成进行实现的

优化的内容,将所有的需要解析的内容,放到了list中进行实现,这样后续增加字段或者修改字段,只需要修改一个地方就可以的了

#!/usr/bin/python3

import xml.dom.minidom  as xd #导入处理xml文件的模块
import pandas as pd
import xlwt

# name_dict = {}
slist_list=[]
svalue_list=[]
name_list =["BRANCH_CODE","DEPT_ID","DEPT_CODE","DEPT_NAME","LEVELS","IS_USED","INPUTCODE1","INPUTCODE2","KIND_ID","STATE","PARENT_ID"]
for i in range(len(name_list)):
    value_name = name_list[i]+"_VALUE"
    svalue_list.append(value_name)
    list_name= name_list[i]+"_LIST"
    slist_list.append(list_name)
    # name_dict[value_name]=list_name

dom = xd.parse("E:\workstation\pythonStation\dept.xml")
Packet = dom.documentElement #用于得到dom对象的文档元素,并把获得的对象给root
print((Packet))

if Packet.hasAttribute("defdef"):
    print('Root element: %s' % (Packet.getAttribute("defdef")))
#获得标签为Body的多组标签
child_tag = Packet.getElementsByTagName("GetDeptDict")


for i in range(len(slist_list)):
    locals()[slist_list[i]]=[]


for j in range(len(child_tag)):   
    tag_child = child_tag[j]
    for k in range(len(name_list)):
        if not tag_child.getElementsByTagName(name_list[k])[0].firstChild:
            locals()[svalue_list[k]]= ""
        else:
            locals()[svalue_list[k]] =tag_child.getElementsByTagName(name_list[k])[0].firstChild.data
        locals()[slist_list[k]].append(locals()[svalue_list[k]])

# print(locals()[slist_list[0]])
            
#将列表存储为字典

all_dict ={}
for l in range(len(name_list)):
    all_dict[name_list[l]] = locals()[slist_list[l]]

# print(all_dict)

df = pd.DataFrame(all_dict) #将字典转换为DataFrame

#将DataFrame数据写入excel表中
with pd.ExcelWriter('car_table1.xls') as Writer:
    df.to_excel(Writer,'Sheet1',index=False)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值