我有一个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值,则会出错。
答案 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