我在使用Python将XML文件转换为CSV时遇到了很多麻烦.我看了很多论坛,尝试了lxml和xmlutils.xml2csv,但我无法让它工作.这是来自Garmin GPS设备的GPS数据.
这是我的XML文件的样子,当然缩短了:
2013-12-03T21:08:56Z 0.0000000 0.0000000 0.2000000
我的大量XML文件中有几个trk标签,但我可以设法将它们分开 - 它们代表不同的"段"或GPS设备上的行程.我想要的只是一个CSV文件,其中包含以下内容:
LAT LON TIME ELE 45.4... -122.6... 2013-12... 0.00... ... ... ... ...
这是我到目前为止的代码:
## Call libraries import csv from xmlutils.xml2csv import xml2csv inputs = "myfile.xml" output = "myfile.csv" converter = xml2csv(inputs, output) converter.convert(tag="WHATEVER_GOES_HERE_RENDERS_EMPTY_CSV")
这是另一种替代代码.它只输出一个没有数据的CSV文件,只输出标题lat
和lon
.
import csv import lxml.etree x = '''''' with open('output.csv', 'w') as f: writer = csv.writer(f) writer.writerow(('lat', 'lon')) root = lxml.etree.fromstring(x) for trkpt in root.iter('trkpt'): row = trkpt.get('lat'), trkpt.get('lon') writer.writerow(row) 2013-12-03T21:08:56Z 0.0000000 0.0000000 0.2000000
我该怎么做呢?请注意我是新手,所以更全面的解释会非常棒!
这是一个命名空间的 XML文档.因此,您需要使用各自的命名空间来寻址节点.
文档中使用的命名空间在顶部定义:
xmlns:tc2="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tp1="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns="http://www.topografix.com/GPX/1/1"
所以第一个名称空间被映射到简短形式tc2
,并将用在像这样的元素中<tc2:foobar/>
.最后一个,在它之后没有简短形式xmlns
,被称为默认命名空间,它适用于文档中没有明确使用命名空间的所有元素 - 因此它也适用于您的<trkpt />
元素.
因此,您需要编写root.iter('{http://www.topografix.com/GPX/1/1}trkpt')
以选择这些元素.
为了获得时间和高程,您可以使用trkpt.find()
访问trkpt
节点下面的这些元素,然后element.text
检索这些元素的文本内容(而不是像lat
和的属性lon
).此外,因为time
和ele
元素也使用默认命名空间,所以您必须{namespace}element
再次使用语法来选择那些节点.
所以你可以使用这样的东西:
NS = 'http://www.topografix.com/GPX/1/1' header = ('lat', 'lon', 'ele', 'time') with open('output.csv', 'w') as f: writer = csv.writer(f) writer.writerow(header) root = lxml.etree.fromstring(x) for trkpt in root.iter('{%s}trkpt' % NS): lat = trkpt.get('lat') lon = trkpt.get('lon') ele = trkpt.find('{%s}ele' % NS).text time = trkpt.find('{%s}time' % NS).text row = lat, lon, ele, time writer.writerow(row)
有关XML命名空间的更多信息,请参阅lxml教程中的命名空间部分和XML命名空间上的Wikipedia文章.有关格式的一些详细信息,请参阅GPS eXchange.gpx
格式.