用python处理xml文件并且用soap发送

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用python处理xml文件并且用soap发送相关的知识,希望对你有一定的参考价值。

新的需求中处理数据需要有个payment的操作,功能测试是用soapui发送xml,但是因为那个xml需要的数据较多并且比较麻烦所以想做成自动化,捣鼓了快一周终于成功了QUQ 不容易

记录下做的时候遇到的坑和points

 

1.数据获取

拼xml要从ORACLE中查询多个表单,一开始是写了几个def每个对应一张表的sql

因为中间会有一些上张表的结果是下张的取值,一开始想直接都写到文件里

结果发现执行的时候因为有pyc所以不是实时获取的

改成return,最后输出四个表的结果整在一个return

写的很新手,感觉很累赘,不过暂时没想到更好的方法QUQ

 

用的cx_Oracle的方法,一开始数据库都连不上下了instantclient也不行,最后还是装了oracle_x64完整版

不过这个坑不知道是不是因为一开始公司的电脑装了x86版本的oracle

 

2.拼xml

这个里面也遇到好几个坑

1)xml中有一段<![CDATA[..........]]>需要修改的字段都在里面,可这个中间的标签直接是查不到的,就先输出了这段中间的到一个新的xml再修改

2)结果生成的新的好不容易改好了,拼回去的时候发现字符被转码了,最后加了HTMLParser库,但是用xml.etree.ElementTree 带的方法存还是被转码了

最后还是用了个笨办法就是把输出的xml再次转码ORZ,希望自己回头看这篇文的时候已经可以用正常思维解决这种尴尬问题?

  转码代码

  html_parser = HTMLParser.HTMLParser()
  new_cont = html_parser.unescape(all_the_text)

 

3)被转码的同时还发现xml上面的xmlns变成了ns0查了发现也是需要先注册自己的地址,用的还是xml.etree.ElementTree

  代码

  ET.register_namespace(ws, "url")
  ET.register_namespace(soapenv, "url")

 

PS 这段还遗留了一个问题其中有两个标签的总数是不固定的,他们在一个大标签下

如果少于或者多于模板中的个数,是应该要删掉或者添加相应的大标签及下面的内容(这个大标签下分别有这两个参数和一个空标签)

目前只加了个判断提示,对标签的append和delete还没摸索成功=-= delay吧

 

3.发送soap

这个是无意百度到的一个大佬的方法,基本是搬过来自己加了点配置吧QUQ

  打印代码

# coding=utf-8

import HTMLParser
html_parser = HTMLParser.HTMLParser()
import xml.dom.minidom as dm

def print_decorator(argument):
    def real_decorator(function):
        def wrapper(*args, **kwargs):
            print - * 10 + start of  + argument + - * 10
            function(*args, **kwargs)
            print - * 10 + end of  + argument + - * 10
        return wrapper
    return real_decorator

@print_decorator(Request)
def print_request(request):
    print  .join((request.method, request.path_url))
    print_headers(request.headers)
    print
    if request.body:
        print_xml(request.body)

def print_headers(headers):
    for k, v in headers.items():
        print :.join((k, v))

@print_decorator(Response)
def print_response(response):
    print response.status_code
    print print_headers(response.headers)
    # print print_xml(html_parser.unescape(response.text))
    xml = dm.parseString(html_parser.unescape(response.text))

    print - * 10 + Response xml  + - * 10
    print xml.toprettyxml()

def print_xml(xml_str):
    print xml_str

  发送代码

# coding=utf-8

import requests
from print_utils import *
import HTMLParser
import os


cwd = os.path.dirname(os.getcwd())
filepath = os.path.abspath(cwd + /xml)
def soapXML():
    # url
    # copy from SOAP 1.1 body
    xml = filepath+"/name.xml"
    fileread = open(xml)
    html_parser = HTMLParser.HTMLParser()
    try:
        all_the_text_file = fileread.read()
        # print all_the_text_file
        new_cont_file = html_parser.unescape(all_the_text_file)
        # print new_cont_file
    finally:
        fileread.close()

    request_body = new_cont_file

    request_headers = {Host: url,
                   Content-Type: text/xml; charset=utf-8}

    response = requests.post(url,
                         data=request_body, headers=request_headers)
    s = requests.session()
    s.keep_alive = False
    #   requests.adapters.DEFAULT_RETRIES = 5
    request = response.request
    print_request(request)
    print_response(response)

response的xml一开始也被转码了,加了个xml.dom.minidom库的dm.parseString方法

没想到发送soap这么简单,百度的时候还看到有用urllib2的库来执行的,不过这个方法成功了就没研究delay+1。。。

中间还遇到个坑发送一直报错,日志是hash错误(我们的xml中有一段是多个字段拼起来hash的)

后来发现是环境和服务可能挂了重启了就成功了_(:з」∠)_长呼一口气啊。。

 

前后坑了快一周吧,算是暂时能用了

 

以上是关于用python处理xml文件并且用soap发送的主要内容,如果未能解决你的问题,请参考以下文章

在c#中,用soap调用webservice,发送消息并取得webservice方法里返回的内容,用http 的方法

soap设置报文头值 java

转 用 AXIOM 促进 XML 处理

ASP.NET之SOAP的发送接收与处理类

如何用python解析soap消息体中的参数

使用Postman测试WebService(SOAP协议)接口