如何删除XML / GPX文件的额外内容并使其在Python中再次有效

时间:2018-01-30 08:59:24

标签: python xml-parsing lxml gpx

 ...
    </trk>
</gpx>
        <trkpt lat="53.502100503614564" lon="10.065932731189879">
            <ele>0.0</ele>
            <time>2017-10-15T11:42:39.916+0000</time>
            <speed>0.3</speed>
        </trkpt>

这是我要解析的GPX文件的结尾。不幸的是gpxpylxml我无法解析文件并改为收到错误消息。在</gpx>最终结束后,所有使用过的解析器都无法处理额外的内容。似乎他们只能完全解析它而不是部分解析它。这是真的吗?

我尝试使用open(gpxfile,'r+').read().find("</gpx>")函数解决此问题,以便在使用f.write('')后找到文件的结尾并使用f.seek(positionOfEnd)覆盖其他任何内容。

使用truncate来截断文件的其余部分很遗憾不能在r+写入模式下工作。

此外,我尝试使用etree.iterparse逐行解析文件,但这对我来说也没有用。

此处代码我正在使用:

# with gpxpy
_GPX = open(gpxfile,'r')
gpx = gpxpy.parse(_GPX)

# with lxml
for elem in etree.iterparse(path+"\\"+file, events=('start','end'), tag="gpx"):
   print(elem)

使用gpxpy我得到:

raise mod_gpx.GPXXMLSyntaxException('Error parsing XML: %s' % str(e), e)
gpxpy.gpx.GPXXMLSyntaxException: Error parsing XML: Extra content at the end of the document, line 16, column 3 (line 16)

使用lxml我得到:

File "src\lxml\iterparse.pxi", line 208, in lxml.etree.iterparse.__next__ (src\lxml\etree.c:155949)
File "file:/C:/Users/user.name/Desktop/test/Mission%202.gpx", line 16
lxml.etree.XMLSyntaxError: Extra content at the end of the document, line 16, column 3

我尝试的是:

f = open(path+"\\"+file,'r+')
pos = f.read().find("</gpx>")
f.seek(pos+1)
f.write('testEdit')
f.close

但字符串'testEdit'没有按预期放置,而是放在文件中间的某个位置,甚至不接近gpx标记。

我如何轻松处理这个问题?我还能尝试什么?我正在使用Win7和python2.7

1 个答案:

答案 0 :(得分:0)

我担心我的方法不是处理gpx / xml / html数据的好方法,但你可以试试

import re
from lxml import etree

f = open(gpxfile, 'r')
gpx = re.search(r'\<gpx\>(.|\n)*\<\/gpx\>', f.read()).group(0) # Give you '<gpx>...</gpx>'
tree = etree.fromstring(gpx)

您也可以尝试BeautifulSoup(可能是更好的方法),它可以处理<trkpt>之外的<gpx>标记。

from bs4 import BeautifulSoup

f = open(gpxfile, 'r')
soup = BeautifulSoup(f.read(), 'lxml')