使用Python及XML进行数据、信息传输[下篇]——获取webservice内容、解析xml加工方案

利用python及XML进行数据、信息传输[下篇]——获取webservice内容、解析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>

猜你喜欢

转载自blog.csdn.net/qq_40260867/article/details/85643563