查找XML数据并将其转换为CSV

时间:2013-07-03 15:20:39

标签: python xml csv

JUst需要一些快速帮助。假设我有以下格式如下:

<Solution version="1.0">
   <DrillHoles total_holes="238">
     <description>
       <hole hole_id="1">
         <hole collar="5720.44, 3070.94, 2642.19" />
         <hole toe="5797.82, 3061.01, 2576.29" />
         <hole cost="102.12" />
       </hole>
    ........

编辑:这是我用来创建孔领的代码..等等。

for row in reader:
    if i > 0:
        x1,y1,z1,x2,y2,z2,cost = row
        if current_group is None or i != current_group.text:
            current_group = SubElement(description, 'hole',{'hole_id':"%s"%i})

            collar = SubElement (current_group, 'hole',{'collar':', '.join((x1,y1,z1))}),
            toe = SubElement (current_group, 'hole',{'toe':', '.join((x2,y2,z2))})
            cost = SubElement(current_group, 'hole',{'cost':cost})
    i+=1

等等,我如何获得孔领,孔脚趾和孔成本数据。到目前为止,这是我的一段代码,我认为我非常接近。

with open(outfile, 'w') as file_:

     writer = csv.writer(file_, delimiter="\t")
     for a in zip(root.findall("drillholes/hole/hole collar"),
             root.findall("drillholes/hole/hole toe"),
             root.findall("drillholes/hole/hole cost")):
        writer.writerow([x.text for x in a])

虽然我的程序生成了一个csv文件,但是csv文件是空的,这就是为什么我认为这段代码由于某些搜索而无法获取数据并查找错误。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您没有指定,但我假设您正在使用xml.etree.ElementTree。这里有一些问题:

1)XML区分大小写。 “钻孔”与“DrillHoles”不同。

2)您的路径缺少XML中的“description”元素。

3)要引用属性,不要使用空格,而是使用前缀为“@”的另一个路径元素,如“hole / @ collar”。

考虑到这些,答案应该是这样的:

 for a in zip(root.findall("DrillHoles/description/hole/hole/@collar"),
              root.findall("DrillHoles/description/hole/hole/@toe"),
              root.findall("DrillHoles/description/hole/hole/@cost")):
   writer.writerow([x.text for x in a])

但事实并非如此。测试这个,似乎findall真的不喜欢返回属性节点,可能是因为它们在etree的API中不存在。所以你可以这样做:

 for a in zip(root.findall("DrillHoles/description/hole/hole[@collar]"),
              root.findall("DrillHoles/description/hole/hole[@toe]"),
              root.findall("DrillHoles/description/hole/hole[@cost]")):
   writer.writerow([x[0].get('collar'), x[1].get('toe'), x[2].get('cost')])

但是如果你不得不在for循环中的语句中列出属性,我个人只是取消了zip并执行此操作:

for a in root.findall("DrillHoles/description/hole"):
  writer.writerow([a.find("hole[@"+attr+"]").get(attr) for attr in ("collar", "toe", "cost")])