gpt4 book ai didi

xml - 合并巨大的 XML 文件中的值

转载 作者:数据小太阳 更新时间:2023-10-29 01:51:00 27 4
gpt4 key购买 nike

我需要在一些巨大的 XML 文件中查找和组合信息(doc <- xmlInternalTreeParse(file.name, useInternalNodes=TRUE, trim=TRUE) 导致我的 16GB 计算机在完成之前开始交换到磁盘),并遵循关于 http://www.omegahat.org/RSXML/Overview.html 的良好说明.

从那里添加到示例中,这或多或少是我的文件的样子:

<?xml version="1.0" ?>
<TABLE>
<SCHOOL>
<NAME> School1 </NAME>
<GRADES>
<STUDENT> Fred </STUDENT>
<TEST1> 66 </TEST1>
<TEST2> 80 </TEST2>
<FINAL> 70 </FINAL>
</GRADES>
<TEAMS>
<SOCCER> SoccerTeam1 </SOCCER>
<HOCKEY> HockeyTeam1 </HOCKEY>
</TEAMS>
</SCHOOL>
<SCHOOL>
<NAME> School2 </NAME>
<GRADES>
<STUDENT> Wilma </STUDENT>
<TEST1> 97 </TEST1>
<TEST2> 91 </TEST2>
<FINAL> 98 </FINAL>
</GRADES>
<TEAMS>
<SOCCER> SoccerTeam2 </SOCCER>
</TEAMS>
</SCHOOL>
</TABLE>

我需要列出每个学校的学生以及曲棍球队和球队名称。示例中想要的输出应该是“Fred”、“HockeyTeam1”、“School1”。真实的例子有成千上万的“学校”、“曲棍球队”和“球员”。

如何使用 xmlEventParse 解析文件以提取信息?我试图从文件中提取所有文本字段,但在等待数小时后仍然没有输出。注意:真正的文件比这更嵌套,所以不能一步固定级别来查找信息。

最佳答案

我们将使用 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))
})
}

我们使用函数作为

branches <- teams()
xmlEventParse("event.xml", handlers=NULL, branches=branches)
branches$get()

关于xml - 合并巨大的 XML 文件中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643580/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com