在 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
)
我到处搜索试图找到这个问题的答案,但我还没有完全找到我正在寻找的东西,所以我希望直接询问会有所帮助。
我正在使用 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
)