将 XML 转换为数据框

Posted

技术标签:

【中文标题】将 XML 转换为数据框【英文标题】:Converting XML to dataframe 【发布时间】:2022-01-20 06:45:04 【问题描述】:

我想。 我知道 XML::xmlToDataFrame,但在我的情况下它给出了一个错误。 XML 可以在这里找到: https://api.data.gov.hk/v1/historical-archive/get-file?url=https%3A%2F%2Fresource.data.one.gov.hk%2Ftd%2Ftraffic-detectors%2FrawSpeedVol-all.xml&time=20211216-0513

感谢所有回答!

【问题讨论】:

您要提取哪些记录?探测器还是车道? 【参考方案1】:

由于您的 XML 文件包含多个嵌套的子级,XML::xmlToDataFrame 给出了错误。

我已经使用幼稚的方法解决了这个问题,但它确实有效! 这是我所做的:

下面的代码创建了一个dataframe,标签包含在`'中。

library(xml2)
require(XML)

pg <- read_xml("https://s3-ap-southeast-1.amazonaws.com/historical-resource-archive/2021/12/16/https%253A%252F%252Fresource.data.one.gov.hk%252Ftd%252Ftraffic-detectors%252FrawSpeedVol-all.xml/0513")

records <- xml_find_all(pg, "//lane")

nodenames<-xml_name(xml_children(records))
nodevalues<-trimws(xml_text(xml_children(records)))


lane_id <- nodevalues[seq(1, length(nodevalues), 6)]
speed <- nodevalues[seq(2, length(nodevalues), 6)]
occupancy <- nodevalues[seq(3, length(nodevalues), 6)]
volume <- nodevalues[seq(4, length(nodevalues), 6)]
s.d. <- nodevalues[seq(5, length(nodevalues), 6)]
valid <- nodevalues[seq(6, length(nodevalues), 6)]

df <- data.frame(lane_id, speed, occupancy, volume, s.d., valid)
head(df)

df 看起来像这样:

     lane_id speed occupancy volume s.d. valid
1   Fast Lane    70         0      0    0     Y
2 Middle Lane    76         6      3 11.1     Y
3   Slow Lane    70         6      0    0     Y
4   Fast Lane    82         1      1    0     Y
5 Middle Lane    63         3      1    0     Y
6   Slow Lane    79         2      1    0     Y

如果要提取&lt;detectors&gt;的数据,可以使用如下代码:

################ Extract Detector Data #########
records2 <- xml_find_all(pg, "//detector")
vals2 <- trimws(xml_text(records2))

nodenames2 <-xml_name(xml_children(records2))
nodevalues2 <-trimws(xml_text(xml_children(records2)))

detector_id <- nodevalues2[seq(1, length(nodevalues2), 3)]
direction <- nodevalues2[seq(2, length(nodevalues2), 3)]
lanes <- nodevalues2[seq(3, length(nodevalues2), 3)]

df2 <- data.frame(detector_id, direction, lanes)
head(df2)

df2 看起来像这样:

  detector_id  direction                                              lanes
1    AID01101 South East Fast Lane70000YMiddle Lane766311.1YSlow Lane70600Y
2    AID01102 North East    Fast Lane82110YMiddle Lane63310YSlow Lane79210Y
3    AID01103 South East   Fast Lane50000YMiddle Lane65210YSlow Lane192310Y
4    AID01104 North East                     Fast Lane50000YSlow Lane63110Y
5    AID01105 North East                     Fast Lane50100YSlow Lane53410Y
6    AID01106 South East                     Fast Lane50300YSlow Lane56510Y

但是,如您所见,lanes 列并未按照您的意愿进行清理,因为它是 XML 中的孙标记。

不过,您可以根据需要从dfdf2 创建一个新的数据框。

【讨论】:

感谢您的帮助!

以上是关于将 XML 转换为数据框的主要内容,如果未能解决你的问题,请参考以下文章

将 .XML 文件转换为数据框

将具有重复节点的 XML 转换为 R 数据框

如何将 XML 节点内容转换为 VBA 中的字符串?

Spark:如何从具有属性的多个嵌套 XML 文件转换为 Data Frame 数据

将数据框转换为rec数组(将对象转换为字符串)

如何将熊猫数据框转换为多索引数据框