#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