python - 使用python从csv数据生成一个新的xml
问题描述
我想生成下面的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>
我无法正确更改标签。任何人都可以在这里指出这个问题。
解决方案
您可以手动构建 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>
推荐阅读
- python - 为每一行读取具有不同语法的表
- c - 找出在哪个名称下调用了 XLL 自定义工作表函数
- php - Laravel 错误:调用未定义的方法 App\Cart::delete()
- facebook - 如何提取关注、喜欢或评论我的 Facebook 页面的人的个人资料?
- node.js - 如何在 NextJS 中记录所有路由
- python - 如何删除百分号?
- sql - Oracle 11G 动态生成插入 SQL
- javascript - 无法读取未定义 discord.js 的属性“计数”
- swift - 如何从 Realm 数据库中选择记录?
- reactjs - 在反应中覆盖另一个组件的样式