【发布时间】:2017-09-07 09:13:10
【问题描述】:
我有以下 XML,我正在尝试使用 sp_xml_preparedocument 和 OPENXML 从中选择某些数据,但我没有得到任何结果:
DECLARE @hDoc AS INT
,@XML xml = '<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" creator="MapSource 6.15.6" version="1.1" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
<metadata>
<link href="http://www.garmin.com">
<text>Garmin International</text>
</link>
<time>2013-06-25T13:37:18Z</time>
<bounds maxlat="42.3806126" maxlon="27.7387079" minlat="42.3448138" minlon="27.7156218" />
</metadata>
<trk>
<name>ACTIVE LOG 033</name>
<extensions>
<gpxx:TrackExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpxx:DisplayColor>White</gpxx:DisplayColor>
</gpxx:TrackExtension>
</extensions>
<trkseg>
<trkpt lat="42.3806126" lon="27.7234045">
<time>2013-06-25T06:44:31Z</time>
<extensions>
<gpxx:TrackPointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpxx:Temperature>24.2592182</gpxx:Temperature>
<gpxx:Depth>19.8200226</gpxx:Depth>
</gpxx:TrackPointExtension>
</extensions>
</trkpt>
<trkpt lat="42.3802007" lon="27.7237631">
<time>2013-06-25T06:44:48Z</time>
<extensions>
<gpxx:TrackPointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpxx:Temperature>24.2816105</gpxx:Temperature>
<gpxx:Depth>19.1851730</gpxx:Depth>
</gpxx:TrackPointExtension>
</extensions>
</trkpt>
<trkpt lat="42.3798285" lon="27.7240684">
<time>2013-06-25T06:45:03Z</time>
<extensions>
<gpxx:TrackPointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpxx:Temperature>24.2928104</gpxx:Temperature>
<gpxx:Depth>18.4135780</gpxx:Depth>
</gpxx:TrackPointExtension>
</extensions>
</trkpt>
</trkseg>
</trk>
</gpx>'
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML,'<root xmlns:a="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3"/>'
SELECT GPSName, GPSLat, GPSLon, GPSTime, GPSTemp, GPSDepth
FROM OPENXML(@hDoc, 'gpx/trk/trkseg/trkpt/extensions/gpxx:TrackPointExtension')
WITH
(
GPSName [varchar](100) '../../name'
,GPSLat decimal(18,7) '../../../../@lat'
,GPSLon decimal(18,7) '../../../../@lon'
,GPSTime datetime '../../../../time'
,GPSTemp decimal(18,7) '/gpxx:Temperature'
,GPSDepth decimal(18,7) '/gpxx:Depth'
)
EXEC sp_xml_removedocument @hDoc
使用上面我得到 Null(零行)。你能帮我理解我做错了什么吗?以及如何正确获取数据?
刚刚对 SELECT 语句进行了更改:
SELECT GPSName, GPSLat, GPSLon, GPSTime, GPSTemp, GPSDepth
FROM OPENXML(@hDoc, 'a:gpx/a:trk/a:trkseg/a:trkpt/a:extensions/gpxx:TrackPointExtension',1)
WITH
(
GPSName [varchar](100) '../../name'
,GPSLat decimal(18,7) '../../../../@lat'
,GPSLon decimal(18,7) '../../../../@lon'
,GPSTime datetime '../../../../time'
,GPSTemp decimal(18,7) '/gpxx:Temperature'
,GPSDepth decimal(18,7) '/gpxx:Depth'
)
现在我返回了行,但那里仍然只有 NULL 值:
GPSName GPSLat GPSLon GPSTime GPSTemp GPSDepth
------------------------------ ------------ ------------ -------------- -------------- ----------------
NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL NULL
(3 row(s) affected)
【问题讨论】:
-
是的,我做的或多或少是一样的,谢谢,但是 XML 要复杂得多(具有不同深度的命名空间、属性和值),显然还有更多的东西要申请正确的结果...
标签: sql-server xml tsql