我有一个大的XML文件,我需要在R中使用xmlEventParse进行解析.遗憾的是,在线示例比我需要的更复杂,我只想标记匹配的节点标记来存储匹配的节点文本(非属性),每个文本都在一个单独的列表中,请参阅下面代码中的注释:
library(XML)
z <- xmlEventParse(
"my.xml",
handlers = list(
startDocument = function()
{
cat("Starting document\n")
},
startElement = function(name,attr)
{
if ( name == "myNodeToMatch1" ){
cat("FLAG Matched element 1\n")
}
if ( name == "myNodeToMatch2" ){
cat("FLAG Matched element 2\n")
}
},
text = function(text) {
if ( # Matched element 1 .... )
# Store text in element 1 list
if ( # Matched element 2 .... )
# Store text in element 2 …Run Code Online (Sandbox Code Playgroud) 我需要在一些巨大的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>
Run Code Online (Sandbox Code Playgroud)
我需要为每个学校的学生列出曲棍球队和队名.示例中所需的输出应为"Fred","HockeyTeam1","School1".真实的例子有成千上万的"学校","曲棍球队"和"球员".
如何使用xmlEventParse解析文件以提取信息?我试图从文件中提取所有文本字段,但经过几个小时的等待后仍然没有输出.注意:真实文件比这更嵌套,因此不需要步骤固定级别来查找信息.
基于上一个问题(请参阅此处),我尝试通过 xmlEventParse 读取许多大型 xml 文件,同时保存节点变化的数据。使用此示例 xml: https: //www.nlm.nih.gov/databases/dtd/medsamp2015.xml。
下面的代码使用 xpathSapply 提取必要的值,并使用一系列 if 语句以将唯一值 (PMID) 与记录中的每个非唯一值 (LastName) 相匹配的方式组合这些值 - 对于这些值,可能存在没有姓氏。目标是一路写入一系列小的 csv(此处为每 1000 个姓氏之后),以最大限度地减少内存使用量。
当在全尺寸数据集上运行时,代码成功批量输出文件,但是某些内容仍然存储在内存中,一旦使用所有 RAM,最终会导致系统错误。我在代码运行时观察了任务管理器,并且可以看到 R 的内存随着程序的进展而增长。如果我在运行中停止程序,然后清除 R 工作区(包括隐藏项目),则内存似乎仍被 R 使用。直到我关闭 R 后,内存才会再次释放。
自己运行几次,即使在清除工作区之后,您也会发现 R 的内存使用量仍在增长。
请帮忙!对于以这种方式读取大型 XML 文件的其他人来说,此问题似乎很常见(请参阅此问题中的示例注释)。
我的代码如下:
library(XML)
filename <- "~/Desktop/medsamp2015.xml"
tempdat <- data.frame(pmid=as.numeric(),
lname=character(),
stringsAsFactors=FALSE)
cnt <- 1
branchFunction <- function() {
func <- function(x, ...) {
v1 <- xpathSApply(x, path = "//PMID", xmlValue)
v2 <- xpathSApply(x, path = "//Author/LastName", xmlValue)
print(cbind(c(rep(v1,length(v2))), …Run Code Online (Sandbox Code Playgroud)