2017-01-13 7 views
0

Я пытаюсь импортировать tcx-файл из Garmin в SQL Server с помощью SSIS. К сожалению, я полностью потерял, как создать xsd для импорта нужных данных. Garmin XSD - http://www8.garmin.com/xmlschemas/TrainingCenterDatabasev2.xsd. И части меня беспокоит только элементы здесь:Импорт данных времени и частоты сердечных сокращений в SQL Server из файла TCX через SSIS

<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 было бы полезно. Спасибо

ответ

1

Если вы хотите импортировать часть файла XML без изменений, вам не нужно создавать собственный xsd. Все, что вам нужно сделать, это:

  • Возьмите XSD-файл из Garmit (предполагая, что является действительным, и совпадет с вашими данными) и файл XML
  • В пакете SSIS добавьте потока данных задачу, источник XML в нем, выберите ваш XML-файл в качестве источника и файл Garmin XSD в виде файла схемы
  • В качестве альтернативы вы можете попробовать это, XML Source может спроектировать (угадать) XSD из предоставленного XML. Я бы рекомендовал это только в качестве отправной точки, поскольку предполагаемый XSD очень приблизительный и основан только на предоставленном образце; он может неверно интерпретировать типы узлов и атрибутов на основе выборки.
  • Источник XML обычно создает множество выходов, поэтому вам необходимо проверить с помощью средства просмотра данных, в котором содержатся данные, которые вам нужны.

После игры с этим прототипом вы можете преобразовать пакет в соответствии с вашими потребностями.

+0

К сожалению, XSD от Garmin не работает. Он устраняет ошибки на нескольких узлах, у которых нет выхода. Я отмечаю ваш, поскольку ответ из-за этого будет работать, если XSD действителен. –

+0

@DaytonBrown, спасибо! Если XSD Garmin является неправильным, и вы не чувствуете его создания самостоятельно, вы можете складывать несколько образцов XML и генерировать XSD для них из редактора SSIS и источника XML, как указано в пункте 3 выше. – Ferdipux

1

Вы не предоставили свой XML-файл ... Но я нашел один sample of a TCX-file here и another 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   .... 
+0

Мне нужно использовать SSIS. Это означает, что мне нужен XML-импорт. Это прямой SQL. Это будет работать, если я буду использовать объемную копию или что-то подобное. Спасибо за пример. –