(1)、直接上代码:
#!/usr/bin/python3
#coding=gbk
data_file='X1550658004008726.xml'
import xml.etree.ElementTree as ET
import re
try:
'''
正常解析xml编码格式是utf-8的
'''
object_data=ET.ElementTree(file=data_file)
except Exception as error:
'''
解析不正常的编码格式gbk或者是gb2312
'''
with open(data_file,mode='r',encoding='gb2312') as file_r,open('%s.bak' % (data_file),mode='w',encoding='utf-8') as file_w:
for data_text in file_r.readlines():
if re.search(r'encoding="gb2312"',data_text,re.I):
new_data=re.sub(r'encoding="gb2312"','encoding="utf-8"',data_text)
file_w.write(new_data)
elif re.search(r'encoding="gbk"',data_text,re.I):
new_data=re.sub(r'encoding="gbk"','encoding="utf-8"',data_text)
file_w.write(new_data)
else:
file_w.write(data_text)
file_r.close()
file_w.close()
object_data=ET.ElementTree(file='%s.bak' % (data_file))
finally:
print(object_data)
root=object_data.getroot()
print("根元素名:",root.tag)
print("根元素属性列表:",root.attrib)
print("根元素属包含内容:",root.attrib)
column_sort=root.iter(tag='FieldNo')
###############整理元素映射字典关系###############
key_names=[]
for sub_tag in column_sort:
###print("寻找到的元素包含内容",sub_tag.text)
key_names.append(sub_tag.text)
print("键名列表:",key_names)
column_names=root.iter(tag='FieldName')
value_names=[]
for sub_tag in column_names:
####print("寻找到的元素包含内容",sub_tag.text)
value_names.append(sub_tag.text)
print("值列表:",value_names)
data_map=dict(zip(key_names,value_names))
print(data_map)
(2)、xml源文件(X1550658004008726.xml):
<?xml version="1.0" encoding="gb2312"?>
<xml>
<FILE_STRUCTURE>
<Field>
<FieldNo>0</FieldNo>
<FieldName>RELATED_PROVINCE_NAME</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>RELATED_PROVINCE_NAME</FieldNameOther>
</Field>
<Field>
<FieldNo>1</FieldNo>
<FieldName>RELATED_CITY_NAME</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>RELATED_CITY_NAME</FieldNameOther>
</Field>
<Field>
<FieldNo>2</FieldNo>
<FieldName>RELATED_COUNTY_NAME</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>RELATED_COUNTY_NAME</FieldNameOther>
</Field>
<Field>
<FieldNo>3</FieldNo>
<FieldName>RELATED_SITE_CUID</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>RELATED_SITE_CUID</FieldNameOther>
</Field>
<Field>
<FieldNo>4</FieldNo>
<FieldName>RES_CODE</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>RES_CODE</FieldNameOther>
</Field>
<Field>
<FieldNo>5</FieldNo>
<FieldName>DEVICE_CODE</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>DEVICE_CODE</FieldNameOther>
</Field>
<Field>
<FieldNo>6</FieldNo>
<FieldName>TYPE</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>TYPE</FieldNameOther>
</Field>
<Field>
<FieldNo>7</FieldNo>
<FieldName>LABEL_CN</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>LABEL_CN</FieldNameOther>
</Field>
<Field>
<FieldNo>8</FieldNo>
<FieldName>SIGNAL_STA_NAME</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>SIGNAL_STA_NAME</FieldNameOther>
</Field>
<Field>
<FieldNo>9</FieldNo>
<FieldName>VALUE</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>VALUE</FieldNameOther>
</Field>
<Field>
<FieldNo>10</FieldNo>
<FieldName>REPORTED_TIME</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>REPORTED_TIME</FieldNameOther>
</Field>
<Field>
<FieldNo>11</FieldNo>
<FieldName>battery_capacity</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>battery_capacity</FieldNameOther>
</Field>
<Field>
<FieldNo>12</FieldNo>
<FieldName>dc_load_current</FieldName>
<FieldType>SQL_VARCHAR(255)</FieldType>
<FieldNameOther>dc_load_current</FieldNameOther>
</Field>
</FILE_STRUCTURE>
</xml>
(3)、最终执行输出结果(自行根据想法来提取元素):
<xml.etree.ElementTree.ElementTree object at 0x7f56f2036160>
根元素名: xml
根元素属性列表: {}
根元素属包含内容: {}
键名列表: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']
值列表: ['RELATED_PROVINCE_NAME', 'RELATED_CITY_NAME', 'RELATED_COUNTY_NAME', 'RELATED_SITE_CUID', 'RES_CODE', 'DEVICE_CODE', 'TYPE', 'LABEL_CN', 'SIGNAL_STA_NAME', 'VALUE', 'REPORTED_TIME', 'battery_capacity', 'dc_load_current']
{'0': 'RELATED_PROVINCE_NAME', '1': 'RELATED_CITY_NAME', '2': 'RELATED_COUNTY_NAME', '3': 'RELATED_SITE_CUID', '4': 'RES_CODE', '5': 'DEVICE_CODE', '6': 'TYPE', '7': 'LABEL_CN', '8': 'SIGNAL_STA_NAME', '9': 'VALUE', '10': 'REPORTED_TIME', '11': 'battery_capacity', '12': 'dc_load_current'}