快速阅读xml文件并转换为数据框

时间:2018-01-19 21:34:06

标签: r xml xpath

我有一个XML文件Tags.xml结构如此

<?xml version="1.0" encoding="utf-8"?>
<tags>
  <row Id="1" TagName=".net" Count="261481" ExcerptPostId="3624959" WikiPostId="3607476" />
  <row Id="2" TagName="html" Count="710104" ExcerptPostId="3673183" />
  <row Id="3" TagName="javascript" Count="1519901" ExcerptPostId="3624960" WikiPostId="3607052" />
...
</tags>

它的结构相对较好,只是某些行缺少属性(例如,上面的第2行缺少WikiPostId)。我可以使用以下代码将数据转换为data.table(或data.frame)

library(XML)
library(data.table)

# Read XML
tagsXML <- xmlParse("Tags.xml")

# Convert to List
tagsList <- xmlToList(tagsXML)

# Each List element is a character vector.  Convert each of these into a data.table
tagsList <- lapply(tagsList, function(x) as.data.table(as.list(x)))

# Rbind all the 1-row data.tables into a single data.table
tags <- rbindlist(tagsList, use.names = T, fill = T)

这有效,但似乎不必要地慢。考虑到我的数据结构良好,有没有更快的方法来做到这一点?我尝试按xpath中的建议使用this answer,但未成功。例如,如果我尝试使用tagsXML[["(//tags/@Id)"]]提取每行中的Id值,则会出错。

1 个答案:

答案 0 :(得分:1)

对于以属性为中心的XML,请考虑未记录的xmlAttrsToDataFrame

df <- XML:::xmlAttrsToDataFrame(getNodeSet(tagsXML, path='//row'))

#   Id    TagName   Count ExcerptPostId WikiPostId
# 1  1       .net  261481       3624959    3607476
# 2  2       html  710104       3673183       <NA>
# 3  3 javascript 1519901       3624960    3607052