Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在巨大的XML文件中组合值_Xml_R - Fatal编程技术网

在巨大的XML文件中组合值

在巨大的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”节点的函数,以及两个用于在完成后检索结

我需要在一些巨大的XML文件中查找和组合信息(doc我认为您可以使用普通的数据框架。因此:

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()