Я искал везде, пытаясь найти ответ на этот вопрос, и я еще не совсем нашел то, что ищу, поэтому я надеюсь, что прямой вопрос поможет.
Я работаю с API отслеживания USPS, который обеспечивает вывод в формате XML. API ограничен 35 результатами на вызов (т. е. вы можете предоставить только 35 номеров отслеживания, чтобы получать информацию о каждом вызове API), и мне нужна информация примерно о 90 000 номеров отслеживания, поэтому я запускаю свои вызовы в цикле for. Мне удалось сохранить результаты звонка в виде списка, но затем у меня возникли проблемы с экспортом списка как есть во что-либо пригодное для использования. Однако, когда я попытался преобразовать результаты из списка в JSON, он удалил тег атрибута, который содержал номер отслеживания, который я использовал для создания результатов.
Вот как выглядит образец результата:
<TrackResponse>
<TrackInfo ID = "XXXXXXXXXXX1">
<TrackSummary> Your item was delivered at 6:50 am on February 6 in BARTOW FL 33830.</TrackSummary>
<TrackDetail>February 6 6:49 am NOTICE LEFT BARTOW FL 33830</TrackDetail>
<TrackDetail>February 6 6:48 am ARRIVAL AT UNIT BARTOW FL 33830</TrackDetail>
<TrackDetail>February 6 3:49 am ARRIVAL AT UNIT LAKELAND FL 33805</TrackDetail>
<TrackDetail>February 5 7:28 pm ENROUTE 33699</TrackDetail>
<TrackDetail>February 5 7:18 pm ACCEPT OR PICKUP 33699</TrackDetail>
Вот скрипт, который я запустил, чтобы получить вывод, с которым я сейчас работаю:
final_tracking_info <- list()
for (i in 1:x) { # where x = the number of calls to the API the loop will need to make
usps = input_tracking_info[i] # input_tracking_info = GET commands
usps = read_xml(usps)
final_tracking_info1[[i+1]]<-usps$TrackResponse
gc()
}
final_output <- toJSON(final_tracking_info)
write(final_output,"final_tracking_info.json") # tried converting to JSON, lost the ID attribute
cat(capture.output(print(working_list),file = "Final_Tracking_Info.txt")) # exported the list to a textfile, was not an ideal format to work with
Что я в конечном итоге хочу получить из этих данных, так это таблицу, содержащую номер отслеживания, первую и последнюю детали трека. Мне интересно, есть ли лучший способ скомпилировать это в XML/JSON, который облегчит преобразование в tibble/df в будущем? Есть ли какой-либо простой способ/предпочтительный формат для выбора, основываясь на том факте, что я знаю, что большинство столбцов будут иметь одно и то же имя («Детали дорожки»), а DF должны быть разной длины (поскольку каждый пакет будет иметь разный номер деталей трека), когда я пытаюсь скомпилировать 1000 результатов в один окончательный вывод?
Использование XML::xmlToList()
сохранит атрибут ID
в .attrs
:
$TrackSummary
[1] " Your item was delivered at 6:50 am on February 6 in BARTOW FL 33830."
$TrackDetail
[1] "February 6 6:49 am NOTICE LEFT BARTOW FL 33830"
$TrackDetail
[1] "February 6 6:48 am ARRIVAL AT UNIT BARTOW FL 33830"
$TrackDetail
[1] "February 6 3:49 am ARRIVAL AT UNIT LAKELAND FL 33805"
$TrackDetail
[1] "February 5 7:28 pm ENROUTE 33699"
$TrackDetail
[1] "February 5 7:18 pm ACCEPT OR PICKUP 33699"
$.attrs
ID
"XXXXXXXXXXX1"
Способ использования этого вывода, который предполагает, что Summary и ID всегда присутствуют как первый и последний элементы соответственно:
xml_data <- XML::xmlToList("71563898.xml") %>%
unlist() %>% # flattening
unname() # removing names
data.frame (
ID = tail(xml_data, 1), # getting last element
Summary = head(xml_data, 1), # getting first element
Info = xml_data %>% head(-1) %>% tail(-1) # remove first and last elements
)