Apple Health XML для SQL Server

#sql-server #xml

#sql-сервер #xml

Вопрос:

Я хочу обработать XML-данные, которые я импортировал из экспортированного XML-файла Apple Health. Данные XML хранятся в таблице импорта, и я пытаюсь использовать sp_xml_preparedocument для подготовки документа и запроса данных.

Описанный ниже подход работал для другой части XML-файла, в частности, для сводки действий. Теперь я получаю следующую ошибку:

 Msg 6603, Level 16, State 2, Line 23
XML parsing error: NodeTest expected here.

@-->[<--type]
  

Примеры, приведенные Microsoft в их документации, похоже, работают с данными с различной структурой, поэтому я не уверен, как и смогу ли я адаптировать один из их примеров к своим потребностям.

Я попробовал следующее:

 DECLARE @XML AS XML;
DECLARE @hDoc AS INT;

SELECT @XML = XMLData FROM [Data].AppleImport;
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML

SELECT [type],
       sourceName,
       sourceVersion,
       unit,
       creationDate,
       startDate,
       endDate,
       [value]
FROM OPENXML(@hDoc, 'HealthData/Record')
WITH
(
    [type] NVARCHAR(50) '@[type]',
    sourceName NVARCHAR(50) '@sourceName',
    sourceVersion NVARCHAR(50) '@sourceVersion',
    unit NVARCHAR(50) '@unit',
    creationDate NVARCHAR(50) '@creationDate',
    startDate NVARCHAR(50) '@startDate',
    endDate NVARCHAR(50) '@endDate',
    [value] NVARCHAR(50) '@[value]'
)

EXEC sp_xml_removedocument @hDoc;
  

Структура данных XML (извлеченные части для brewity):

 <HealthData locale="nb_NO">
    <ExportDate value="2020-09-03 12:10:19  0200"/>
    <Me HKCharacteristicTypeIdentifierDateOfBirth="1988-01-01" HKCharacteristicTypeIdentifierBiologicalSex="HKBiologicalSexMale" HKCharacteristicTypeIdentifierBloodType="HKBloodTypeNotSet" HKCharacteristicTypeIdentifierFitzpatrickSkinType="HKFitzpatrickSkinTypeNotSet"/>
    <Record type="HKQuantityTypeIdentifierHeight" sourceName="amsten sin iPhone" sourceVersion="13.0" unit="cm" creationDate="2019-09-23 15:19:48  0200" startDate="2019-09-23 15:19:48  0200" endDate="2019-09-23 15:19:48  0200" value="188"/>
    <Record type="HKQuantityTypeIdentifierHeight" sourceName="Helse" sourceVersion="11.4.1" unit="cm" creationDate="2018-07-31 21:42:50  0200" startDate="2018-07-31 21:42:50  0200" endDate="2018-07-31 21:42:50  0200" value="188"/>
    <MetadataEntry key="HKWasUserEntered" value="1"/>
    </Record>
    <Record type="HKQuantityTypeIdentifierHeartRate" sourceName="amsten sin Apple Watch" sourceVersion="5.3.1" device="amp;<amp;<HKDevice: 0x2834d03c0amp;>, name:Apple Watch, manufacturer:Apple Inc., model:Watch, hardware:Watch4,4, software:5.3.1amp;>" unit="count/min" creationDate="2019-09-15 06:38:32  0200" startDate="2019-09-15 06:30:08  0200" endDate="2019-09-15 06:30:08  0200" value="49">
    <MetadataEntry key="HKMetadataKeyHeartRateMotionContext" value="1"/>
    </Record>
</HealthData>
  

Приветствуется любая информация о том, как действовать, или хорошие материалы для чтения.

Комментарии:

1. Опубликованный XML недопустим — второй <Record type="HKQuantityTypeIdentifierHeight"/> элемент самозакрывается, когда этого не должно быть.

Ответ №1:

При использовании допустимого XML также попробуйте использовать следующую инструкцию OPENXML:

 SELECT [type],
       sourceName,
       sourceVersion,
       unit,
       creationDate,
       startDate,
       endDate,
       [value]
FROM OPENXML(@hDoc, 'HealthData/Record')
WITH
(
    [type] NVARCHAR(50) '@type',
    sourceName NVARCHAR(50) '@sourceName',
    sourceVersion NVARCHAR(50) '@sourceVersion',
    unit NVARCHAR(50) '@unit',
    creationDate NVARCHAR(50) '@creationDate',
    startDate NVARCHAR(50) '@startDate',
    endDate NVARCHAR(50) '@endDate',
    [value] NVARCHAR(50) '@value'
)
  

Обратите внимание, что '@[type]' и '@[value]' были изменены на '@type' и '@value' .