我想生成以下xml。有线索吗?
CSV data
id,value,
1,10
2,20
<root>
<xs:sample name="id">
<xs:final>
<xs:id>1</xs:id>
</xs:final>
<xs:new base="xs:string">
<xs:maxLength value="10"/>
</xs:new>
</xs:sample>
<xs:sample name="id">
<xs:final>
<xs:id>2</xs:id>
</xs:final>
<xs:new base="xs:string">
<xs:maxLength value="20"/>
</xs:new>
</xs:sample>
</root>
我使用过lxml.etree,但是输出的xml结构却有所不同。
我不想像在csv中循环那样对值进行硬编码
示例代码,我用过:
import csv
import lxml.etree as ET
headers = ['id','value']
root = ET.Element("root")
xssample = ET.SubElement(root, "xssample")
xsfinal = ET.SubElement(xssample, "xsfinal")
xsnew = ET.SubElement(xssample, "xsnew")
xsid = ET.SubElement(xsfinal, "xsid")
xsmaxlength = ET.SubElement(xsnew, "xsmaxlength")
filename = 'sample.csv'
with open(filename) as f:
next(f) # SKIP HEADER
csvreader = csv.reader(f)
for row in csvreader:
for x in range(len(headers)):
data = ET.SubElement(root, "xssample", {'name':headers[x]})
for col in range(len(headers)):
node = ET.SubElement(data, headers[col]).text = str(row[col])
# SAVE XML TO FILE
tree_out = (ET.tostring(root, pretty_print=True, xml_declaration=True, encoding="UTF-8"))
# OUTPUTTING XML CONTENT TO FILE
with open('Output.xml', 'wb') as f:
f.write(tree_out)
输出结构不同:
<?xml version='1.0' encoding='UTF-8'?>
<root>
<xssample>
<xsfinal>
<xsid/>
</xsfinal>
<xsnew>
<xsmaxlength/>
</xsnew>
</xssample>
<xssample name="id">
<id>1</id>
<value>10</value>
</xssample>
<xssample name="value">
<id>1</id>
<value>10</value>
</xssample>
<xssample name="id">
<id>2</id>
<value>20</value>
</xssample>
<xssample name="value">
<id>2</id>
<value>20</value>
</xssample>
</root>
我无法正确更改标签。谁能在这里指出问题。
答案 0 :(得分:0)
您可以手动构建XML:
import pandas as pd
result = ''
df = pd.read_csv('file.csv')
for index, row in df.iterrows():
result += '''<xs:sample name="id"><xs:final><xs:id>{}</xs:id></xs:final><xs:new base="xs:string"><xs:maxLength value="{}"/></xs:new></xs:sample>'''.format(int(row['id']), int(row['value']))
root = '<root>{}</root>'.format(result)
输出:
<root><xs:sample name="id"><xs:final><xs:id>1</xs:id></xs:final><xs:new base="xs:string"><xs:maxLength value="10"/></xs:new></xs:sample><xs:sample name="id"><xs:final><xs:id>2</xs:id></xs:final><xs:new base="xs:string"><xs:maxLength value="20"/></xs:new></xs:sample></root>