XML 到 sql 使用 openxml

XML to sql with openxml

任何人都可以帮助我,为什么我从 XML-Document 中什么也得不到?我认为它与第一行有关,因为如果我用 "xsi:" 或 "ns3:" 之类的东西擦除这一行和所有其他行,我会得到预期的输出 "Biking".

代码:

DECLARE @XmlDocumentHandle int
DECLARE @XmlDocument nvarchar(max)
SET @XmlDocument = 
'<TrainingCenterDatabase xsi:schemaLocation="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2 http://www.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd" xmlns:ns5="http://www.garmin.com/xmlschemas/ActivityGoals/v1" xmlns:ns3="http://www.garmin.com/xmlschemas/ActivityExtension/v2" xmlns:ns2="http://www.garmin.com/xmlschemas/UserProfile/v2" xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns4="http://www.garmin.com/xmlschemas/ProfileExtension/v1">
  <Activities>
    <Activity Sport="Biking">
      <Id>2014-09-28T08:48:39.000Z</Id>
      <Lap StartTime="2014-09-28T08:48:39.000Z">
        <TotalTimeSeconds>17766.56</TotalTimeSeconds>
        <DistanceMeters>65047.04</DistanceMeters>
        <MaximumSpeed>15.639999</MaximumSpeed>
        <Calories>4113</Calories>
        <AverageHeartRateBpm>
          <Value>142</Value>
        </AverageHeartRateBpm>
        <MaximumHeartRateBpm>
          <Value>182</Value>
        </MaximumHeartRateBpm>
        <Intensity>Active</Intensity>
        <TriggerMethod>Manual</TriggerMethod>
        <Track>
          <Trackpoint>
            <Time>2014-09-28T08:48:40.000Z</Time>
            <Position>
              <LatitudeDegrees>48.18774196319282</LatitudeDegrees>
              <LongitudeDegrees>16.302834944799542</LongitudeDegrees>
            </Position>
            <AltitudeMeters>83.5999984741211</AltitudeMeters>
            <DistanceMeters>3.180000066757202</DistanceMeters>
            <HeartRateBpm>
              <Value>94</Value>
            </HeartRateBpm>
            <Extensions>
              <ns3:TPX>
                <ns3:Speed>0.0</ns3:Speed>
              </ns3:TPX>
            </Extensions>
          </Trackpoint>
          <Trackpoint>
            <Time>2014-09-28T08:48:45.000Z</Time>
            <Position>
              <LatitudeDegrees>48.18779996596277</LatitudeDegrees>
              <LongitudeDegrees>16.30263394676149</LongitudeDegrees>
            </Position>
            <AltitudeMeters>83.4000015258789</AltitudeMeters>
            <DistanceMeters>19.360000610351562</DistanceMeters>
            <HeartRateBpm>
              <Value>100</Value>
            </HeartRateBpm>
            <Extensions>
              <ns3:TPX>
                <ns3:Speed>0.0</ns3:Speed>
              </ns3:TPX>
            </Extensions>
          </Trackpoint>
        </Track>
     </Lap>
      <Creator xsi:type="Device_t">
        <Name>Garmin Edge 705</Name>
        <UnitId>3417593319</UnitId>
        <ProductID>625</ProductID>
        <Version>
          <VersionMajor>3</VersionMajor>
          <VersionMinor>3</VersionMinor>
          <BuildMajor>0</BuildMajor>
          <BuildMinor>0</BuildMinor>
        </Version>
      </Creator>
    </Activity>
  </Activities>
  <Author xsi:type="Application_t">
    <Name>Garmin Connect API</Name>
    <Build>
      <Version>
        <VersionMajor>16</VersionMajor>
        <VersionMinor>15</VersionMinor>
        <BuildMajor>4</BuildMajor>
        <BuildMinor>4</BuildMinor>
      </Version>
    </Build>
    <LangID>en</LangID>
    <PartNumber>003-F3589-01</PartNumber>
  </Author>
</TrainingCenterDatabase>'

EXEC sp_xml_preparedocument @XmlDocumentHandle OUTPUT, @XmlDocument

SELECT    *
FROM      OPENXML (@XmlDocumentHandle, 'TrainingCenterDatabase/Activities/Activity')
           WITH (
                    Sport nvarchar(max) '@Sport'
                )

EXEC sp_xml_removedocument @XmlDocumentHandle
SELECT    *
FROM      OPENXML (@XmlDocumentHandle, '*[local-name()=''TrainingCenterDatabase'']/*[local-name()=''Activities'']/*[local-name()=''Activity'']')
           WITH (
                    Sport nvarchar(max) '@Sport'
                )

您可以learn about XML namespaces.

在这种特殊情况下,TrainingCenterDatabase 节点中的表达式 xmlns="http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2" 定义了默认名称空间,因此所有后代元素都绑定到此名称空间,除非另有说明。

您的 XPath 正在尝试寻址绑定到默认 "no namespace" 命名空间的元素,因此它们不匹配。

你可以执行

SELECT * FROM OPENXML (@XmlDocumentHandle, '.')

查看结果 table 的 'namespaceuri' 列中每个元素的命名空间。