【发布时间】:2014-03-17 20:18:38
【问题描述】:
我一定是在这里做错了什么,我在 SO 上看到和搜索的每个示例似乎都表明这是可行的。
我正在尝试使用带有 lxml etree 库的 XPath 搜索来解析 garmin tcx 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<TrainingCenterDatabase xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd">
<Workouts>
<Workout Sport="Biking">
<Name>3P2 WK16 - 3</Name>
<Step xsi:type="Step_t">
<StepId>1</StepId>
<Name>[MP19]6:28-6:38</Name>
<Duration xsi:type="Distance_t">
<Meters>13000</Meters>
</Duration>
<Intensity>Active</Intensity>
<Target xsi:type="Speed_t">
<SpeedZone xsi:type="PredefinedSpeedZone_t">
<Number>2</Number>
</SpeedZone>
</Target>
</Step>
......
</Workout>
</Workouts>
</TrainingCenterDatabase>
我只想返回类型为 PredefinedSpeedZone_t 的 SpeedZone 元素。我以为我能做到:
root = ET.parse(open('file.tcx'))
xsi = {'xsi': 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2'}
for speed_zone in root.xpath(".//xsi:SpeedZone[@xsi:type='PredefinedSpeedZone_t']", namespaces=xsi):
print speed_zone
虽然情况似乎并非如此。我尝试了很多删除/添加命名空间的组合,但无济于事。如果我删除属性搜索并将其保留为 ".//xsi:SpeedZone" 则返回:
<Element {http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2}SpeedZone at 0x2595188>
正如我所料。
我想我可以在 for 循环中做到这一点,但感觉应该可以在一行中完成!
【问题讨论】:
标签: python xml xpath xml-parsing lxml