在巨大的XML文件中组合值
我需要在一些巨大的XML文件中查找和组合信息(doc我认为您可以使用普通的数据框架。因此:在巨大的XML文件中组合值,xml,r,Xml,R,我需要在一些巨大的XML文件中查找和组合信息(doc我认为您可以使用普通的数据框架。因此: f=xmlParse('file.xml') df=xmlToDataFrame(f) 然后你有一个数据框,做一些条件来过滤对象。 或者,您想使用xml树、属性和值 r=xmlRoot(f) 调用r,或者像r[[1]][[1]]这样的每个分支将为您提供School1我们将使用XML包 library(XML) 并创建一个闭包,其中包含一个用于处理“SCHOOL”节点的函数,以及两个用于在完成后检索结
f=xmlParse('file.xml')
df=xmlToDataFrame(f)
然后你有一个数据框,做一些条件来过滤对象。
或者,您想使用xml树、属性和值
r=xmlRoot(f)
调用r,或者像r[[1]][[1]]这样的每个分支将为您提供
School1
我们将使用XML包
library(XML)
并创建一个闭包,其中包含一个用于处理“SCHOOL”节点的函数,以及两个用于在完成后检索结果的帮助函数。SCHOOL函数在每个SCHOOL节点上调用。如果它找到曲棍球队,则使用/SCHOOL/NAME/text()作为“键”,并使用/SCHOOL/TEAMS/hockey/text()和//STUDENT/text()(或/SCHOOL/GRADES/STUDENT/text())作为值。默认情况下,每100所拥有曲棍球队的学校都会打印一条消息,以便显示一些进展情况。在事后使用“get”函数检索结果
teams <- function(progress=1000) {
res <- new.env(parent=emptyenv()) # for results
it <- 0L # iterator -- nodes visited
list(SCHOOL=function(elt) {
## handle 'SCHOOL' nodes
if (getNodeSet(elt, "not(/SCHOOL/TEAMS/HOCKEY)"))
## early exit -- no hockey team
return(NULL)
it <<- it + 1L
if (it %% progress == 0L)
message(it)
school <- getNodeSet(elt, "string(/SCHOOL/NAME/text())") # 'key'
res[[school]] <-
list(team=getNodeSet(elt,
"normalize-space(/SCHOOL/TEAMS/HOCKEY/text())"),
students= xpathSApply(elt, "//STUDENT", xmlValue))
}, getres = function() {
## retrieve the 'res' environment when done
res
}, get=function() {
## retrieve 'res' environment as data.frame
school <- ls(res)
team <- unlist(eapply(res, "[[", "team"), use.names=FALSE)
student <- eapply(res, "[[", "students")
len <- sapply(student, length)
data.frame(school=rep(school, len), team=rep(team, len),
student=unlist(student, use.names=FALSE))
})
}
团队谢谢,但是文件太大了,所以没有RAM来执行此操作。我的意思是在每个文件中执行循环,然后将提取的数据聚合到一个文件中。如果我的评论没有用,很抱歉。XML包具有灵活性,可以迭代大型文件。是的,我查看了这些问题,并尝试在这里应用它们,但我的XML技能太差,无法使他和我有联系。
teams <- function(progress=1000) {
res <- new.env(parent=emptyenv()) # for results
it <- 0L # iterator -- nodes visited
list(SCHOOL=function(elt) {
## handle 'SCHOOL' nodes
if (getNodeSet(elt, "not(/SCHOOL/TEAMS/HOCKEY)"))
## early exit -- no hockey team
return(NULL)
it <<- it + 1L
if (it %% progress == 0L)
message(it)
school <- getNodeSet(elt, "string(/SCHOOL/NAME/text())") # 'key'
res[[school]] <-
list(team=getNodeSet(elt,
"normalize-space(/SCHOOL/TEAMS/HOCKEY/text())"),
students= xpathSApply(elt, "//STUDENT", xmlValue))
}, getres = function() {
## retrieve the 'res' environment when done
res
}, get=function() {
## retrieve 'res' environment as data.frame
school <- ls(res)
team <- unlist(eapply(res, "[[", "team"), use.names=FALSE)
student <- eapply(res, "[[", "students")
len <- sapply(student, length)
data.frame(school=rep(school, len), team=rep(team, len),
student=unlist(student, use.names=FALSE))
})
}
branches <- teams()
xmlEventParse("event.xml", handlers=NULL, branches=branches)
branches$get()