Как выбрать значение в R из xml-документа?

#r #xpath

Вопрос:

У меня есть xml-документ с некоторыми данными о состоянии здоровья, который является форматом экспорта базы данных Apple health по умолчанию. Я усек этот документ здесь, но это действительный xml-документ. Как выбрать все атрибуты «значение», соответствующие другому атрибуту? например, как мне получить матрицу или фрейм данных для всех type="HKQuantityTypeIdentifierBodyMass" ? Или все мои высоты?

Я пробовал что-то подобное, но оно возвращает только нулевые значения.

 library(xml2)  xml lt;- read_xml('lt;?xml version="1.0" encoding="UTF-8"?gt; lt;HealthData locale="en_US"gt;  lt;ExportDate value="2021-10-29 20:24:26 -0700"/gt;  lt;Me HKCharacteristicTypeIdentifierDateOfBirth="1975-05-18" HKCharacteristicTypeIdentifierBiologicalSex="HKBiologicalSexMale" HKCharacteristicTypeIdentifierBloodType="HKBloodTypeNotSet" HKCharacteristicTypeIdentifierFitzpatrickSkinType="HKFitzpatrickSkinTypeNotSet" HKCharacteristicTypeIdentifierCardioFitnessMedicationsUse="None"/gt;  lt;Record  type="HKQuantityTypeIdentifierHeight"  sourceName="Neil’s Apple Watch"  sourceVersion="2.1"  unit="ft"  creationDate="2016-02-23 14:12:38 -0700"  startDate="2016-02-23 14:12:38 -0700"  endDate="2016-02-23 14:12:38 -0700"  value="6.16667"/gt;  lt;Record type="HKQuantityTypeIdentifierHeight" sourceName="Neil’s Apple Watch" sourceVersion="2.2.1" unit="ft" creationDate="2016-08-17 08:00:37 -0700" startDate="2016-08-17 08:00:37 -0700" endDate="2016-08-17 08:00:37 -0700" value="6.16667"/gt;  lt;Record type="HKQuantityTypeIdentifierBodyMass" sourceName="Neil’s Apple Watch" sourceVersion="2.1" unit="lb" creationDate="2016-02-23 14:12:38 -0700" startDate="2016-02-23 14:12:38 -0700" endDate="2016-02-23 14:12:38 -0700" value="175"/gt;  lt;Record type="HKQuantityTypeIdentifierBodyMass" sourceName="Neil’s Apple Watch" sourceVersion="2.2.1" unit="lb" creationDate="2016-08-17 08:00:36 -0700" startDate="2016-08-17 08:00:36 -0700" endDate="2016-08-17 08:00:36 -0700" value="180"/gt;  lt;Record type="HKQuantityTypeIdentifierBodyMass"  sourceName="Neils Apple Watch"  sourceVersion="2.1"  unit="lb"  creationDate="2016-02-23 14:12:38 -0700"  startDate="2016-02-23 14:12:38 -0700"  endDate="2016-02-23 14:12:38 -0700"  value="175"/gt; lt;/HealthDatagt;')  listOfAllMyHeights lt;- xml_text(xml, "???") listOfAllMyWeights lt;- xml_something("???")    print(heights)```  

Ответ №1:

 library(tidyverse) xml2::xml_find_all(xml, ".//Record") %gt;%   purrr::map(xml_attrs) %gt;%  purrr::map_df(as.list)   # type sourceName sourceVersion unit creationDate startDate endDate value # lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; lt;chrgt; # 1 HKQuantityTypeIdentifierHeight Neil’s App~ 2.1 ft 2016-02-23 1~ 2016-02-2~ 2016-02~ 6.16~ # 2 HKQuantityTypeIdentifierHeight Neil’s App~ 2.2.1 ft 2016-08-17 0~ 2016-08-1~ 2016-08~ 6.16~ # 3 HKQuantityTypeIdentifierBodyMass Neil’s App~ 2.1 lb 2016-02-23 1~ 2016-02-2~ 2016-02~ 175  # 4 HKQuantityTypeIdentifierBodyMass Neil’s App~ 2.2.1 lb 2016-08-17 0~ 2016-08-1~ 2016-08~ 180  # 5 HKQuantityTypeIdentifierBodyMass Neils Appl~ 2.1 lb 2016-02-23 1~ 2016-02-2~ 2016-02~ 175