我的xml是:
<?xml version="1.0" encoding="UTF-8"?>
<ServiceResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://xx.xx.xx/xx/xx/x.x/xx/xx.xsd">
<responseCode>SUCCESS</responseCode>
<count>100</count>
<hasMoreRecords>true</hasMoreRecords>
<lastId>12345</lastId>
<data>
<Main>
<sub1>1</id>
<sub2>a</name>
</Main>
<Main>
<sub1>2</id>
<sub2>b</name>
</Main>
</data>
</ServiceResponse>
我的代码是:
import csv
import xml.etree.ElementTree as etree
xml_file_name = 'blah.xml'
csv_file_name = 'blah.csv'
main_tag_name = 'Main'
fields = ['sub1', 'sub2']
tree = etree.parse(xml_file_name)
with open(csv_file_name, 'w', newline='', encoding="utf-8") as csv_file:
csvwriter = csv.writer(csv_file)
csvwriter.writerow(fields)
for host in tree.iter(tag=main_tag_name):
data = []
for field in fields:
if host.find(field) is not None:
data.append(host.find(field).text)
else:
data.append('')
csvwriter.writerow(data)
以某种方式,我认为这不是解析xml的正确方法,因为它正在树结构中的任何位置搜索“ Main”,并且没有遵循特定的路径进行搜索。含义-如果它在其他任何地方意外找到了“ Main”,则该程序将无法正常运行。
[请您为我提供关于此用例的最优化的方法,主要是一种内置方法,而不是过多的定制。
注意-我想将此文件用作多个xml文件的通用脚本,这些文件在到达主标签之前具有各种标签,然后又具有各种子标签。需要考虑这一点,以确保我们不对树结构进行硬编码并且是可配置的。
您可以尝试基于xpath
的方法。
例如:
with open('some.csv', 'w', newline='') as f:
writer = csv.writer(f)
with open("test.xml") as f:
tree = ET.parse(f)
root = tree.getroot()
sub1_nodes = root.findall('.//data/Main/sub1')
sub2_nodes = root.findall('.//data/Main/sub2')
for a,b in zip(sub1_nodes, sub2_nodes):
writer.writerow([a.text, b.text])