python生成xml文件

本次说明生成一个xml格式的报文,并将其写入文本


# -*- coding:utf8 -*- # 避免中文乱码
__author__ = 'lxf'

import xml.dom.minidom as Dom
from xml.dom import minidom
import random
import time


# 这个方法用来代替minidom里格式化代码,实现节点不换行
def fixed_writexml(self, writer, indent="", addindent="", newl=""):
    # indent = current indentation
    # addindent = indentation to add to higher levels
    # newl = newline string
    writer.write(indent + "<" + self.tagName)
    attrs = self._get_attributes()
    a_names = attrs.keys()
    a_names.sort()

    for a_name in a_names:
        writer.write(" %s=\"" % a_name)
        minidom._write_data(writer, attrs[a_name].value)
        writer.write("\"")
    if self.childNodes:
        if len(self.childNodes) == 1 \
                and self.childNodes[0].nodeType == minidom.Node.TEXT_NODE:
            writer.write(">")
            self.childNodes[0].writexml(writer, "", "", "")
            writer.write("</%s>%s" % (self.tagName, newl))
            return
        writer.write(">%s" % (newl))
        for node in self.childNodes:
            if node.nodeType is not minidom.Node.TEXT_NODE:
                node.writexml(writer, indent + addindent, addindent, newl)
        writer.write("%s</%s>%s" % (indent, self.tagName, newl))
    else:
        writer.write("/>%s" % (newl))


minidom.Element.writexml = fixed_writexml


def write():
    doc = Dom.Document()
    root_node = doc.createElement("service")
    doc.appendChild(root_node)

    head = doc.createElement("SYS_HEAD")
    body = doc.createElement("BODY")

    # SERVICE_CODE
    service_node = doc.createElement("SERVICE_CODE")
    service_value = doc.createTextNode("11005000004")
    service_node.setAttribute("attr", "field")
    service_node.appendChild(service_value)
    head.appendChild(service_node)

    # SERVICE_SCENE
    scene_node = doc.createElement("SERVICE_SCENE")
    scene_value = doc.createTextNode("03")
    scene_node.setAttribute("attr", "field")
    scene_node.appendChild(scene_value)
    head.appendChild(scene_node)

    # CONSUMER_ID
    consumer_node = doc.createElement("CONSUMER_ID")
    consumer_value = doc.createTextNode("033500")
    consumer_node.setAttribute("attr", "field")
    consumer_node.appendChild(consumer_value)
    head.appendChild(consumer_node)

    # CONSUMER_SEQ_NO
    seq_node = doc.createElement("CONSUMER_SEQ_NO")
    seq = 133100201803220002704750 + random.randint(1, 10000)
    seq_value = doc.createTextNode('%d' % seq)
    seq_node.setAttribute("attr", "field")
    seq_node.appendChild(seq_value)
    head.appendChild(seq_node)

    # BUSS_SEQ_NO
    bus_node = doc.createElement("BUSS_SEQ_NO")
    bus_value = doc.createTextNode("2018032284584195")
    bus_node.setAttribute("attr", "field")
    bus_node.appendChild(bus_value)
    head.appendChild(bus_node)

    # TRAN_FLAG
    flag_node = doc.createElement("TRAN_FLAG")
    flag_value = doc.createTextNode("0")
    flag_node.setAttribute("attr", "field")
    flag_node.appendChild(flag_value)
    head.appendChild(flag_node)

    # TRAN_DATE
    date_node = doc.createElement("TRAN_DATE")
    date_value = doc.createTextNode(time.strftime('%Y%m%d'))
    date_node.setAttribute("attr", "field")
    date_node.appendChild(date_value)
    head.appendChild(date_node)

    # TRAN_TIMESTAMP
    time_node = doc.createElement("TRAN_TIMESTAMP")
    time_value = doc.createTextNode("000014")
    time_node.setAttribute("attr", "field")
    time_node.appendChild(time_value)
    head.appendChild(time_node)

    c_node = doc.createElement("END_DATE")
    c_value = doc.createTextNode("20180322")
    c_node.setAttribute("attr", "field")
    c_node.appendChild(c_value)
    body.appendChild(c_node)

    root_node.appendChild(head)
    root_node.appendChild(body)
    print (doc.toxml("utf-8"))
    f = open("ttt.xml", "w")
    f.write(doc.toprettyxml(indent="\t", newl="\n", encoding="utf-8"))
    f.close()


if __name__ == "__main__":
    write()

下面是生成的xml报文

<?xml version="1.0" encoding="utf-8"?>
<service>
	<SYS_HEAD>
		<SERVICE_CODE attr="field">11005000004</SERVICE_CODE>
		<SERVICE_SCENE attr="field">03</SERVICE_SCENE>
		<CONSUMER_ID attr="field">033500</CONSUMER_ID>
		<CONSUMER_SEQ_NO attr="field">133100201803220002704951</CONSUMER_SEQ_NO>
		<BUSS_SEQ_NO attr="field">2018032284584195</BUSS_SEQ_NO>
		<TRAN_FLAG attr="field">0</TRAN_FLAG>
		<TRAN_DATE attr="field">20180523</TRAN_DATE>
		<TRAN_TIMESTAMP attr="field">000014</TRAN_TIMESTAMP>
	</SYS_HEAD>
	<BODY>
		<END_DATE attr="field">20180322</END_DATE>
	</BODY>
</service>


猜你喜欢

转载自blog.csdn.net/csgarten/article/details/80427091