期望的结果: 我正在尝试生成一张可扩展的救护车位置矢量图,并显示救护车是否忙碌,停止服务,宿舍等的颜色。我们的护理人员可以将此视为一个网页并查看其性能我们所有救护车的地图。一眼就可以看出哪些救护车很忙,哪些是免费的。
我的方法论: 我使用python 2.7与pyodbc和xml.etree。 我正在查询我们的数据库,以确定最近的救护车状态,循环数组并生成数据的svg。
问题: 当输出写入文本并且我使用记事本打开.svg文件时,我看到有一个长行输出。我希望它是嵌套输出。如果你看下面我的代码,你会看到我只测试两辆救护车。但我的系统中有五十辆救护车。我不可能有一长串数千个字符。
问题: 如何让python / ElementTree在输出中写出换行符?
代码如下所示:
import pyodbc
from xml.etree import ElementTree as et
cnxn = pyodbc.connect('DRIVER={SQL Server}; SERVER=my server; DATABASE=my database; UID=my user id; PWD=my password')
cursor = cnxn.cursor()
AmbulanceStatus = """
WITH Maxtimes AS
(
SELECT
MAX(M_Manpower_PK) AS [FirstRecord]
, PUN_UnitID
FROM MManpower
INNER JOIN PUnit ON M_kUnit = PUN_Unit_PK
WHERE PUN_UnitID LIKE 'M__'
OR PUN_UnitID LIKE 'FBA__'
AND M_tTime > DATEADD(HOUR, -24, GETDATE())
GROUP BY PUN_UnitID
)
,
MaxAttributes AS
(
SELECT
M_Manpower_PK
, M_tTime
, M_Code
, CASE
WHEN M_Code IN ('USTA', 'USER', 'USOL', 'USAR', 'USIZ', 'UF', 'USTR', 'USDP') THEN 'Working'
WHEN M_Code IN ('USAQ', 'USRQ') THEN 'Free'
WHEN M_Code IN ('USES', 'USSB', 'USAS', 'USRS', 'USLC') THEN 'Standby'
WHEN M_Code IN ('USOS') THEN 'OutofService'
ELSE 'NA'
END AS [Disposition]
FROM MManpower
INNER JOIN PUnit ON M_kUnit = PUN_Unit_PK
WHERE PUN_UnitID LIKE 'M__'
OR PUN_UnitID LIKE 'FBA__'
AND M_tTime > DATEADD(HOUR, -24, GETDATE())
)
SELECT
MaxTimes.firstRecord AS [RecordNumber]
, MaxTimes.PUN_UnitID AS [Ambulance]
, CONVERT(VARCHAR(20), MaxAttributes.M_tTime, 108) AS [FinalTimeStamp]
, MaxAttributes.M_Code AS [UnitStatus]
, MaxAttributes.Disposition AS [Disposition]
FROM Maxtimes
LEFT OUTER JOIN MaxAttributes ON Maxtimes.FirstRecord=MaxAttributes.M_Manpower_PK
"""
cursor.execute(AmbulanceStatus)
Ambulances = cursor.fetchall()
cursor.close()
for ambulance in Ambulances:
print ambulance
doc = et.Element('svg', width='792', height='612', version='1.1', xmlns='http://www.w3.org/2000/svg')
#===============================================================================
# I have no idea how to implement the following 15 lines of code. I downloaded them from the internet. I have googled this question and someone believes the following lines of code can help write out carriage returns.
#===============================================================================
# def indent(elem, level=0):
# i = "\n" + level * " "
# if len(elem):
# if not elem.text or not elem.text.strip():
# elem.text = i + " "
# if not elem.tail or not elem.tail.strip():
# elem.tail = i
# for elem in elem:
# indent(elem, level + 1)
# if not elem.tail or not elem.tail.strip():
# elem.tail = i
# else:
# if level and (not elem.tail or not elem.tail.strip()):
# elem.tail = i
#===============================================================================
j = 0
#===============================================================================
# medic 19
#===============================================================================
while j < len(Ambulances):
if Ambulances[j][1] == 'M19' and Ambulances[j][4] == 'Free':
fillColor = 'aliceblue'
fillText = 'black'
et.SubElement(doc, 'circle', cx='520', cy='85', r='10', stroke='black', fill=fillColor)
text = et.Element('text', x='520', y='85', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M19' and Ambulances[j][4] == 'Working':
fillColor = 'red'
fillText = 'white'
et.SubElement(doc, 'circle', cx='520', cy='85', r='10', fill=fillColor)
text = et.Element('text', x='520', y='85', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M19' and Ambulances[j][4] == 'Standby':
fillColor = 'green'
fillText = 'white'
et.SubElement(doc, 'circle', cx='520', cy='85', r='10', fill=fillColor)
text = et.Element('text', x='520', y='85', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M19' and Ambulances[j][4] == 'OutofService':
fillColor = 'black'
fillText = 'white'
et.SubElement(doc, 'circle', cx='520', cy='85', r='10', fill=fillColor)
text = et.Element('text', x='520', y='85', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M19' and Ambulances[j][4] == 'NA':
fillColor = 'pink'
fillText = 'blue'
et.SubElement(doc, 'circle', cx='520', cy='85', r='10', fill=fillColor)
text = et.Element('text', x='520', y='85', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
#===============================================================================
# medic 16
#===============================================================================
elif Ambulances[j][1] == 'M16' and Ambulances[j][4] == 'Free':
fillColor = 'aliceblue'
fillText = 'black'
et.SubElement(doc, 'circle', cx='28.80024', cy='45.8372', r='10', stroke='black', fill=fillColor)
text = et.Element('text', x='28.80024', y='45.8372', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M16' and Ambulances[j][4] == 'Working':
fillColor = 'red'
fillText = 'blue'
et.SubElement(doc, 'circle', cx='28.80024', cy='45.8372', r='10', fill=fillColor)
text = et.Element('text', x='28.80024', y='45.8372', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M16' and Ambulances[j][4] == 'Standby':
fillColor = 'green'
fillText = 'white'
et.SubElement(doc, 'circle', cx='28.80024', cy='45.8372', r='10', fill=fillColor)
text = et.Element('text', x='28.80024', y='45.8372', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M16' and Ambulances[j][4] == 'OutofService':
fillColor = 'black'
fillText = 'white'
et.SubElement(doc, 'circle', cx='28.80024', cy='45.8372', r='10', fill=fillColor)
text = et.Element('text', x='28.80024', y='45.8372', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
elif Ambulances[j][1] == 'M16' and Ambulances[j][4] == 'NA':
fillColor = 'pink'
fillText = 'blue'
et.SubElement(doc, 'circle', cx='28.80024', cy='45.8372', r='10', fill=fillColor)
text = et.Element('text', x='28.80024', y='45.8372', fill=fillText, style='font-family:Sans;font-size:12px;text-anchor:middle;dominant-baseline:top')
text.text = Ambulances[j][1]
doc.append(text)
#===============================================================================
# loop through the array
#===============================================================================
j = j + 1
# ElementTree 1.2 doesn't write the SVG file header errata, so do that manually
f = open('C:\sample.svg', 'w')
f.write('<?xml version=\'1.0\' standalone=\'no\'?>\n')
f.write('<!DOCTYPE svg PUBLIC \'-//W3C//DTD SVG 1.1//EN\'\n')
f.write('\'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\'>\n')
f.write(et.tostring(doc))
f.close()
答案 0 :(得分:2)
查看此链接;
http://broadcast.oreilly.com/2010/03/pymotw-creating-xml-documents.html
from xml.dom import minidom
def prettify(elem):
"""Return a pretty-printed XML string for the Element.
"""
rough_string = ET.tostring(elem, 'utf-8')
reparsed = minidom.parseString(rough_string)
return reparsed.toprettyxml(indent=" ")