利用python及XML进行数据、信息传输[下篇]——获取webservice内容、解析xml加工方案
解析xml
在上篇中,我介绍了如何 运用python的XML.etree.ElementTree迭代生成结构状的xml。在下篇,我将介绍如何将xml中的数据转化为传递加工、建模方案所利用的信息。
0 转化xml流
在大数据转化为xml的时候,效率、时间是我们不得不考虑的问题。经测试,pandas.datafram格式的10w条数据转化为xml,耗时在秒级别还可以接受。
def dfm_to_xml_workflow(data):
"""
按照之前定义好的数据传输xml格式,定义成一个生成的流程
这种方法,1w条数据要2'23''
:return: db ,迭代创建树,然后生成xml
"""
# 1.创建一个db根节点
[db, db_n3] = xml_db()
# 2.创建一个tb根节点
[db, tb_n3, tb_n4] = xml_tablesItem(db, db_n3)
# 3.创建dataItem
[list_type, list_len] = find_dfm_cols_most(data)
print(list_type, list_len)
count = 0
for i in data.columns:
db = xml_fieldItems(db, tb_n3, i, list_len[count], list_type[count])
count += 1
for row in range(0, len(data.values)):
[db, dataItems] = xml_dataRows(db, tb_n4)
# print('now is :',row/len(data.values))
for col in data.columns:
# print(data.values[row][col])
db = xml_dataItem(db, dataItems, col, data.loc[row, col])
return db
data.loc[row,col]的访问方式比data.values[row][col]要高上许多。
1 解析xml
1.1 利用suds获取webservice上传递的xml
# 根据13位geoID为密码,获取webservice上的xml
from suds.client import Client
new_serviceURL = 'http://localhost:8080/****/ePort?wsdl' # webservice的服务网址
client = Client(new_serviceURL) # 获取上边的内容
get_xml = client.service.getProcessing_schemeXMLByID(geoID)
with open(write_xml_path, 'w', encoding='gbk')as f:
f.write(get_xml)
1.2 获取xml的根节点
tree = ET.parse(write_xml_path) # 解析xml文件成树结构
root = tree.getroot() # 获取最外根节点
1.3 解析根节点中的标签内容
def find_label_info_list(root, son_name, label_name):
"""
找到root中,所以子节点下所有标签的内容
:param root: 根节点树
:param son_name:子节点
:param label_name: 标签
:return: 标签中的内容
"""
list_info = [] # 存内容
for element in root.iter(son_name): # 获取当前根目录下的子目录
# print(element)
for info in element.iter(label_name): # 获取子目录中的标签
list_info.append(info.text) # 标签中的文字
if len(list_info):
print('Successfully Parsed label: %s !'%(label_name))
else:
print('Please check the label.')
return list_info
下面给出一个加工方案以供测试:
<algorithmlist>
<ProcessingDataStorage.Entity.scheme__unit>
<ID>59d611f2-8e12-4472-987c-e2deafeefd13</ID>
<dbname>school</dbname>
<tbname>student</tbname>
<cloname>name</cloname>
<role>tonull</role>
<param>null</param>
<word>null</word>
<parentID>9db480e5-f4dc-4184-9553-7015e3e76cf3</parentID>
</ProcessingDataStorage.Entity.scheme__unit>
<ProcessingDataStorage.Entity.scheme__unit>
<ID>7eb34055-9d5e-4cf5-8740-f6b25cc53604</ID>
<dbname>school</dbname>
<tbname>average_wage</tbname>
<cloname>year</cloname>
<role>tonull</role>
<param>null</param>
<word>null</word>
<parentID>9db480e5-f4dc-4184-9553-7015e3e76cf3</parentID>
</ProcessingDataStorage.Entity.scheme__unit>
</algorithmlist>