首页 > 解决方案 > 使用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>

我无法正确更改标签。任何人都可以在这里指出这个问题。

标签: pythonxml

解决方案


您可以手动构建 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>

推荐阅读