<p>因为XML文档不是文本文档,所以避免使用字符串连接构建XML。相反,考虑使用DOM方法使用第三方^ {CD1> }建立树,甚至内置模块,^ {CD2}}(稍加修改)。对于数据,按<code>MRBTS</code>字段遍历数据帧的子集:</p>
<pre><code>import lxml.etree as et
import pandas as pd
### STATIC PART OF XML
root = et.Element('raml', {"version": "2.0", "xmlns": "raml20.xsd"})
cmData = et.SubElement(root, "cmData",
{"type":"plan", "scope":"all", "name":"iprt", "id":"PlanConfiguration( 7152069 )"})
header = et.SubElement(cmData, "header")
log = et.SubElement(header, "log",
{"dateTime":"2020-06-19T07:38:16.000-03:00", "action":"created", "appInfo":"PlanExporter"})
log.text = "InternalValues are used"
### DYNAMIC PART OF XML
df = pd.DataFrame({'MRBTS':['13004','13004','13005','13005','13005'],
'dest':['10.104.0.0','10.107.0.0','10.104.0.0','10.102.0.0','0.0.0.0'],
'gw':['10.48.0.0','10.45.0.0','10.130.0.0','10.130.0.0','10.110.0.0'],
'length':['16','16','8','8','16']})
# SUBSET ITERATION
for i, g in df.groupby("MRBTS"):
managedObject = et.SubElement(cmData, "managedObject", {"distName":"MRBTS-"+i})
list = et.SubElement(managedObject, "list")
# BUILD DICTIONARY OUT OF EACH ROW
d = g.drop('MRBTS', axis='columns').to_dict('index')
for ik, iv in d.items():
item = et.SubElement(list, 'item')
for k, v in iv.items():
p = et.SubElement(item, 'p', {"name":k})
p.text = v
# OUTPUT TREE
tree = et.ElementTree(root)
tree_out = tree.write("Output.xml",
xml_declaration=True,
encoding="UTF-8",
pretty_print=True,
doctype="<!DOCTYPE raml SYSTEM 'raml20.dtd'>")
</code></pre>
<p><strong>输出XML</strong></p>
<pre><code><?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
<cmData id="PlanConfiguration( 7152069 )" name="iprt" scope="all" type="plan">
<header>
<log action="created" appInfo="PlanExporter" dateTime="2020-06-19T07:38:16.000-03:00">InternalValues are used</log>
</header>
<managedObject distName="MRBTS-13004">
<list>
<item>
<p name="dest">10.104.0.0</p>
<p name="gw">10.48.0.0</p>
<p name="length">16</p>
</item>
<item>
<p name="dest">10.107.0.0</p>
<p name="gw">10.45.0.0</p>
<p name="length">16</p>
</item>
</list>
</managedObject>
<managedObject distName="MRBTS-13005">
<list>
<item>
<p name="dest">10.104.0.0</p>
<p name="gw">10.130.0.0</p>
<p name="length">8</p>
</item>
<item>
<p name="dest">10.102.0.0</p>
<p name="gw">10.130.0.0</p>
<p name="length">8</p>
</item>
<item>
<p name="dest">0.0.0.0</p>
<p name="gw">10.110.0.0</p>
<p name="length">16</p>
</item>
</list>
</managedObject>
</cmData>
</raml>
</code></pre>