【问题标题】:Importing time and heart rate data into SQL Server from TCX file via SSIS通过 SSIS 将时间和心率数据从 TCX 文件导入 SQL Server
【发布时间】:2017-05-29 05:34:33
【问题描述】:

我正在尝试使用 SSIS 将 Garmin 连接中的 tcx 文件导入 SQL Server。不幸的是,我完全不知道如何创建 xsd 以导入我想要的数据点。 Garmin XSD 是http://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd。而我关心的部分只是这里的元素:

<xsd:complexType name="Trackpoint_t">
    <xsd:sequence>
        <xsd:element type="xsd:dateTime" name="Time"/>
        <xsd:element type="Position_t" name="Position" minOccurs="0"/>
        <xsd:element type="xsd:double" name="AltitudeMeters" minOccurs="0"/>
        <xsd:element type="xsd:double" name="DistanceMeters" minOccurs="0"/>
        <xsd:element type="HeartRateInBeatsPerMinute_t" name="HeartRateBpm" minOccurs="0"/>
        <xsd:element type="CadenceValue_t" name="Cadence" minOccurs="0"/>
        <xsd:element type="SensorState_t" name="SensorState" minOccurs="0"/>
        <xsd:element type="Extensions_t" name="Extensions" minOccurs="0">
            <xsd:annotation>
        </xsd:element>
    </xsd:sequence>

任何有关如何创建 xsd 的指示都会有所帮助。谢谢

【问题讨论】:

    标签: sql-server xml ssis xsd


    【解决方案1】:

    如果您想不修改地导入部分 XML 文件,您不必设计自己的 xsd。您需要做的就是:

    • 从 Garmit 获取 XSD 文件(假设它是有效的并且与您的数据一致)和您的 XML 文件
    • 在 SSIS 包中,添加数据流任务,在其中添加 XML 源,选择您的 XML 文件作为源,Garmin XSD 文件作为模式文件
    • 或者,您可以试试这个,XML Source 可以从提供的 XML 设计(猜测)XSD。我建议仅将其作为起点,因为猜测的 XSD 非常近似并且仅基于提供的示例;它可能会根据样本误解节点和属性类型。
    • XML 源通常会产生大量输出,因此您必须使用数据查看器检查哪一个包含您需要的数据。

    玩过这个原型后,您可以根据需要转换包。

    【讨论】:

    • 不幸的是,Garmin 的 XSD 不起作用。它在一些没有任何输出的节点上出错。我将您的答案标记为答案,因为如果 XSD 有效,它将起作用。
    • @DaytonBrown,谢谢!如果 Garmin 的 XSD 有误并且您不觉得自己创建它,您可以堆叠多个 XML 示例并从 SSIS 编辑器和 XML 源为它们生成 XSD,如上面第 3 点所述。
    【解决方案2】:

    您没有提供您的 XML 文件...但我找到了一个 sample of a TCX-file hereanother one here。阅读本文不需要架构。我希望,当您看到以下示例时,您可以解决您的问题:

        DECLARE @xml XML=
        N'<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">
      <Activities>
        <Activity Sport="Running">
          <Id>2015-01-25T12:14:34Z</Id>
          <Lap StartTime="2015-01-25T12:14:34Z">
            <TotalTimeSeconds>507.0989990</TotalTimeSeconds>
            <DistanceMeters>1000.0000000</DistanceMeters>
            <MaximumSpeed>2.5790000</MaximumSpeed>
            <Calories>95</Calories>
            <AverageHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
              <Value>155</Value>
            </AverageHeartRateBpm>
            <MaximumHeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
              <Value>173</Value>
            </MaximumHeartRateBpm>
            <Intensity>Resting</Intensity>
            <TriggerMethod>Distance</TriggerMethod>
            <Track>
              <Trackpoint>
                <Time>2015-01-25T12:14:34Z</Time>
                <Position>
                  <LatitudeDegrees>50.8918607</LatitudeDegrees>
                  <LongitudeDegrees>16.7403161</LongitudeDegrees>
                </Position>
                <AltitudeMeters>233.1999969</AltitudeMeters>
                <DistanceMeters>0.0000000</DistanceMeters>
                <HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
                  <Value>88</Value>
                </HeartRateBpm>
                <Extensions>
                  <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2" CadenceSensor="Footpod">
                    <Speed>0.0000000</Speed>
                  </TPX>
                </Extensions>
              </Trackpoint>
            </Track>
            <Track />
            <Extensions>
              <FatCalories xmlns="http://www.garmin.com/xmlschemas/FatCalories/v1">
                <Value>0</Value>
              </FatCalories>
              <LX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2">
                <AvgSpeed>1.9720000</AvgSpeed>
              </LX>
            </Extensions>
          </Lap>
        </Activity>
      </Activities>
    </TrainingCenterDatabase>';
    
    WITH XMLNAMESPACES(DEFAULT 'http://www.garmin.com/xmlschemas/TrainingCenterDatabase/v2')
    select Act.value(N'@Sport','nvarchar(max)') AS Activity_Sport
          ,Act.value(N'(Id)[1]','datetime') AS Activity_Id
          ,Lap.value(N'@StartTime','datetime') AS Lap_StartTime
          ,Lap.value(N'(TotalTimeSeconds)[1]','decimal(20,8)') AS Lap_TotalTimeSeconds
          --more fields
          ,Lap.value(N'(Calories)[1]','int') AS Lap_TotalTimeSeconds
          ,Lap.value(N'(AverageHeartRateBpm/Value)[1]','int') AS Lap_AverageHeartRateBpm
          ,Lap.value(N'(MaximumHeartRateBpm/Value)[1]','int') AS Lap_MaximumHeartRateBpm
          ,Lap.value(N'(Intensity)[1]','nvarchar(max)') AS Lap_Intensity
          --more fields
          ,TrP.value(N'(Time)[1]','datetime') AS Track_Trackpoint_Time
          ,TrP.value(N'(Position/LatitudeDegrees)[1]','decimal(20,8)') AS Track_Trackpoint_Position_LatitudeDegrees
          --more fields
    FROM @xml.nodes(N'/TrainingCenterDatabase/Activities/Activity') AS A(Act)
    OUTER APPLY Act.nodes(N'Lap') AS B(Lap)
    OUTER APPLY Lap.nodes(N'Track/Trackpoint') AS C(TrP)
    

    结果

    Activity_Sport  Activity_Id             Lap_StartTime           Lap_TotalTimeSeconds    ....
    Running         2015-01-25 12:14:34.000 2015-01-25 12:14:34.000 507.09899900            ....
    

    【讨论】:

    • 我需要使用 SSIS。这意味着我需要 XML 导入。这是直接的 SQL。如果我使用批量复制或类似的东西,这会起作用。不过谢谢你的例子。
    猜你喜欢
    • 2016-12-04
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    相关资源
    最近更新 更多