在 R 中以 XML 格式编译 API 输出

Compiling API outputs in XML format in R

我到处搜索试图找到这个问题的答案,但我还没有完全找到我正在寻找的东西,所以我希望直接询问会有所帮助。

我正在使用 USPS Tracking API,它提供 XML 格式的输出。 API 每次调用限制为 35 个结果(即您每次调用 API 时只能提供 35 个跟踪号码以获取信息),我需要大约 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

我最终想从这些数据中得到的是 table,其中包含跟踪号、第一条轨道详细信息和最后一条轨道详细信息。我想知道的是,有没有更好的方法在 XML/JSON 中编译它,这样可以更容易地转换为 tibble/df 呢?基于我知道大多数列将具有相同名称(“轨道详细信息”)并且 DF 必须具有不同长度(因为每个当我试图将 1,000 个结果编译成一个最终输出时,包会有不同数量的曲目详细信息?

使用 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" 

假设摘要和 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
)