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



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

我使用的是USPSTrackingneneneba API,它提供了一个XML格式的输出。API每次调用限制为35个结果(即每次调用API时,您只能提供35个跟踪号码来获取信息(,我需要大约90000个跟踪号码的信息,因此我正在循环运行我的调用。我能够将调用的结果存储在一个列表中,但随后我很难将列表原样导出到任何可用的内容中。然而,当我试图将列表中的结果转换为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?当我试图将1000个结果编译成一个最终输出时,我知道大多数列将具有相同的名称("Track Detail"(,并且DF必须具有不同的长度(因为每个包将具有不同数量的跟踪详细信息(,有什么简单的方法/首选格式可以选择吗?

使用XML::xmlToList()将在.attrs:中存储ID属性

$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
)

最新更新