我在使用Python将XML文件转换为CSV时遇到很多麻烦。我看过很多论坛,都尝试过lxml和xmlutils.xml2csv,但是我无法使其正常工作。这是来自Garmin
GPS设备的GPS数据。
这是我的XML文件的样子,当然是缩短了:
<?xml version="1.0" encoding="utf-8"?>
<gpx 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" version="1.1" creator="TC2 to GPX11 XSLT stylesheet" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<trk>
<name>2013-12-03T21:08:56Z</name>
<trkseg>
<trkpt lat="45.4852855" lon="-122.6347885">
<ele>0.0000000</ele>
<time>2013-12-03T21:08:56Z</time>
</trkpt>
<trkpt lat="45.4852961" lon="-122.6347926">
<ele>0.0000000</ele>
<time>2013-12-03T21:09:00Z</time>
</trkpt>
<trkpt lat="45.4852982" lon="-122.6347897">
<ele>0.2000000</ele>
<time>2013-12-03T21:09:01Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
我的大型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 = '''
<?xml version="1.0" encoding="utf-8"?>
<gpx 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" version="1.1" creator="TC2 to GPX11 XSLT stylesheet" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd">
<trk>
<name>2013-12-03T21:08:56Z</name>
<trkseg>
<trkpt lat="45.4852855" lon="-122.6347885">
<ele>0.0000000</ele>
<time>2013-12-03T21:08:56Z</time>
</trkpt>
<trkpt lat="45.4852961" lon="-122.6347926">
<ele>0.0000000</ele>
<time>2013-12-03T21:09:00Z</time>
</trkpt>
<trkpt lat="45.4852982" lon="-122.6347897">
<ele>0.2000000</ele>
<time>2013-12-03T21:09:01Z</time>
</trkpt>
</trkseg>
</trk>
</gpx>
'''
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)
我该怎么做呢?请意识到我是一个新手,所以更全面的解释将非常棒!
这是一个 命名空间的 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
andele
元素也使用默认名称空间,因此您将不得不{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
。
XML输入文件: XML输入文件转换为XML输出文件。将XML输入文件的firstName、middleName和lastName标签合并为XML Ouput文件的name标签,将XML输入文件的address1、address2、city、state和pincode标签合并为XML Ouput文件的address标签。 我几乎转换了代码,但我在这里与empId作斗争。我已经在XSLT文件中手动输
我有以下xml数据集: 我想得到一个分别位于名称“xyz”和“abc”之后的所有单词的列表,例如xyz=[word1,word2,word3,…]abc=[word4,word5,word6,…] 我尝试了以下解决方案: 但我不知道如何引用name=xyz的父对象,然后提取子对象的单词。 谢谢你的帮助!!
问题内容: 我在网络上看到了相当多的不费钱的XML-> JSON代码,并且与Stack的用户进行了一些互动,我坚信这一人群比Google搜索结果的前几页可以提供更多帮助。 因此,我们正在解析天气供稿,我们需要在许多网站上填充天气小部件。我们现在正在研究基于Python的解决方案。 这个公共weather.com RSS feed 是我们要解析的一个很好的例子( 由于有w / them的合作关系,我
问题内容: 我在SO上看到许多问题,询问将XML转换为JSON的方法,但我对采用其他方法感兴趣。是否有用于将JSON转换为XML的python库? 编辑: 什么都没有马上回来,所以我继续写了一个脚本来解决这个问题。 Python已经允许您将JSON转换为本地dict(使用或在版本2.6以下的中,),因此我编写了一个库,可将本地dict 转换为XML字符串。 https://github.com/q
问题内容: 我有一些需要用XML迷惑的HTML文件。我们正在使用这些HTML为应用程序提供内容,但是现在我们必须以XML形式提供这些内容。 HTML文件包含,表格,div,图像,p,b或强标签等。 我用谷歌搜索并找到了一些应用程序,但是我还无法实现。 您能否建议一种将这些文件内容转换为XML的方法? 问题答案: 我成功使用了命令行实用程序。在Linux上,我使用迅速安装了它。然后命令: 给了一个x
问题内容: 我试图将JSON输出转换为XML。不幸的是我得到这个错误: JSON根对象具有多个属性。根对象必须具有单个属性才能创建有效的XML文档。考虑指定DeserializeRootElementName。 这就是我到目前为止所创建的。 这是我的JSON输出: 我怎么解决这个问题? 问题答案: 尽管问题中提供的JSON并不完整,但您在顶层具有多个属性,如异常所示。您必须为其定义根以获取有效的X