我正在尝试使用以下代码将XPath查询应用于具有名称空间的XML数据:
<gpx creator="udos" version="1.1" xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd http://www.garmin.com/xmlschemas/GpxExtensions/v3 http://www.garmin.com/xmlschemas/GpxExtensionsv3.xsd http://www.garmin.com/xmlschemas/TrackPointExtension/v1 http://www.garmin.com/xmlschemas/TrackPointExtensionv1.xsd" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
我希望代码输出如下:
2261.8
2261.6
2262.0
2261.8
替换XML根元素
<gpx>
与
string code =
"<a onClick=\"" +
HttpUtility.HtmlEncode(
"alert('" +
myContentGoesHere.Replace("'", "\\'").Replace("\\", "\\\\") +
"');"
) +
"\">View Error</a>";
代码正在运行......
有关如何使其与命名空间一起使用的任何建议吗?
答案 0 :(得分:2)
您可以将命名空间定义为 -
ns = {'n': 'http://www.topografix.com/GPX/1/1',
'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
'gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}
这会将'http://www.topografix.com/GPX/1/1'
的前缀定义为n
,然后在XPath查询中,您可以使用该前缀。示例 -
expr = 'n:trk/n:trkseg/n:trkpt/n:ele'
for element in tree.xpath(expr, namespaces=ns):
print(element.text)
这是因为根节点的xmlns是 - 'http://www.topografix.com/GPX/1/1'
- 因此所有子节点都自动将其继承为xmlns(名称空间),除非子节点使用不同的前缀或指定自己的名称空间
示例/演示 -
In [44]: ns = {'n': 'http://www.topografix.com/GPX/1/1',
....: 'xsi': 'http://www.w3.org/2001/XMLSchema-instance',
....: 'gpxtpx': 'http://www.garmin.com/xmlschemas/TrackPointExtension/v1',
....: 'gpxx': 'http://www.garmin.com/xmlschemas/GpxExtensions/v3'}
In [45]:
In [45]: expr = 'n:trk/n:trkseg/n:trkpt/n:ele'
In [46]: for element in tree.xpath(expr, namespaces=ns):
....: print(element.text)
....:
2261.8
2261.6
2262.0
2261.8