本次说明生成一个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>