用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的)

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

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

时间: 2024-08-06 03:53:22

用python处理xml文件并且用soap发送的相关文章

python解析xml文件操作的例子

python解析xml文件操作实例,操作XML文件的常见技巧. xml文件内容: <?xml version="1.0" ?> <!--Simple xml document__chapter 8--> <book> <title> sample xml thing </title> <author> <name> <first> ma </first> <last>

python 解析XML文件

比较高效的python 解析XML文件 参考 http://codingpy.com/article/parsing-xml-using-python/ try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET import time def parse_poi_by_elementTree(filepath): t0 = time.time() tree = E

Python解析xml文件遇到的编码解析的问题

使用python对xml文件进行解析的时候,如果xml文件的头文件是utf-8格式的编码,那么解析是ok的,但如果是其他格式将会出现如下异常: xml.parsers.expat.ExpatError: unknown encoding 因此,为了保证程序的正常运行,我们需要对读取的文件进行编码处理. 1.首先将读取的字符从原来的编码解析,并编码成utf-8: 2.修改xml的encoding: 代码如下: import sys import os import datetime import

python读取xml文件报错ValueError: multi-byte encodings are not supported

1.在使用python对xml文件进行读取时,提示ValueError: multi-byte encodings are not supported 很多贴子上说把xml的编码格式改为,就可以正常执行了 <?xml version="1.0" encoding="utf-8"?> 但是事实证明,不成功,解决方法 1.用记事本方式打开xml文件,encoding后面指的就是编码方式 2.把你的xml文件另外为utf-8 在进行读取,文件编码问题解决 原文

python 读取xml文件

首先,获得标签信息abc.xml <?xml version="1.0" encoding="utf-8"?> <catalog> <maxid>4</maxid> <login username="pytest" password="123456"> <caption>Python</caption> <item id="4&

python 生成 xml文件 属性的顺序问题

需求很奇葩. 文档示例 <ITEM key="username" eng="User Name" chn="用户名" val="小明"/> 用python 的xml 导出的xml文件,相应的内容是 <ITEM  chn="用户名" eng="User Name" key="username" val="小明"/> 我们都知道

Python解析XML文件

python对XML的解析 常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同. python有三种方法解析XML,SAX,DOM,以及ElementTree: 1.SAX (simple API for XML ) pyhton 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件. 2.DOM(Document Object Model) 将XML数据在内存中解析成一个树,通过

python处理xml文件

参考:https://docs.python.org/2/library/xml.etree.elementtree.html 例子: <?xml version="1.0"?> <data> <country name="Liechtenstein"> <rank>1</rank> <year>2008</year> <gdppc>141100</gdppc>

Python实现XML文件解析

1. XML简介 XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用.它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性. test.XML文件 <?xml version="1.0" encoding="utf-8"?> <catalog> <m